Bla*_*ade 4 typescript mapped-types
假设我有一个函数:
function registerEvent(event: Event, handler: HandlerSignature);
Run Code Online (Sandbox Code Playgroud)
这些是各自的类型:
enum Event {
EventOne,
EventTwo
}
type HandlerSignature = (...args: any[]) => void;
Run Code Online (Sandbox Code Playgroud)
现在每个事件都可以有不同的函数签名,例如:
function handler1(foo: number, bar: string);
function handler2(foo: string);
Run Code Online (Sandbox Code Playgroud)
我想要实现的是,我可以调用该registerEvent函数,指定第一个参数(事件),并让 TypeScript 检测哪个签名与该事件相对应,即用于智能感知并防止用户为事件分配错误的签名。
我考虑过创建一个映射,在其中将不同的签名分配给枚举值,但我不能真正将其用作类型,可以吗?即使我使用映射类型,我也必须创建一个变量来分配所有事件。
我倾向于函数重载:
enum Events {
EventOne,
EventTwo
}
type HandlerSignature = (...args: any[]) => void;
function registerEvent(event: Events.EventOne, handler: (foo: number, bar: string) => void): void;
function registerEvent(event: Events.EventTwo, handler: (foo: number) => void): void;
function registerEvent(event: Events, handler: HandlerSignature):void {
// ...implementation
}
function handler1(foo: number, bar: string) {}
function handler2(foo: string) {}
registerEvent(Events.EventOne, handler1); // Works
registerEvent(Events.EventOne, handler2); // Error as desired, wrong type for callback
Run Code Online (Sandbox Code Playgroud)
(注意我更改Event为Events;Event是浏览器环境和 Node.js 中预先存在的全局和类型)
| 归档时间: |
|
| 查看次数: |
4814 次 |
| 最近记录: |