jquery 事件与 TS - 如何使其严格?
Events of jquery with TS - how to make it strict?
说我有触发器:
$(window).trigger('kittySaid', ['meow', true, 3]);
以及我在代码中的其他地方
$(window).on('kittySaid', (e, sound:string, isPurring:boolean, age:number)=>{
do something
});
所以问题是:"trigger" 中的类型不检查 "on" 中的类型,因此我可以传递 123 而不是 "meow",并且不会收到任何警告。是否可以像调用函数一样对类型进行触发器检查?
您可以通过以下方式关联类型,使它们保持同步并声明它们之间的关系。
type KittyEvent = 'kittySaid';
type KittySaidEventArguments = [string, boolean, number];
interface JQuery {
trigger(name: KittyEvent, args: KittySaidEventArguments): void;
on(
name: KittyEvent,
handler: (
e: Event,
sound: KittySaidEventArguments[0],
isPurring: KittySaidEventArguments[1],
age: KittySaidEventArguments[2]
) => void
): void;
}
备注:
这需要 TypeScript 2.1,但您应该使用 2.2 或更高版本,因为索引访问类型的许多方面都已改进。
如果您在模块内部,请将上述代码的上述 interface
部分包装在 declare global {...}
块中。
说我有触发器:
$(window).trigger('kittySaid', ['meow', true, 3]);
以及我在代码中的其他地方
$(window).on('kittySaid', (e, sound:string, isPurring:boolean, age:number)=>{
do something
});
所以问题是:"trigger" 中的类型不检查 "on" 中的类型,因此我可以传递 123 而不是 "meow",并且不会收到任何警告。是否可以像调用函数一样对类型进行触发器检查?
您可以通过以下方式关联类型,使它们保持同步并声明它们之间的关系。
type KittyEvent = 'kittySaid';
type KittySaidEventArguments = [string, boolean, number];
interface JQuery {
trigger(name: KittyEvent, args: KittySaidEventArguments): void;
on(
name: KittyEvent,
handler: (
e: Event,
sound: KittySaidEventArguments[0],
isPurring: KittySaidEventArguments[1],
age: KittySaidEventArguments[2]
) => void
): void;
}
备注:
这需要 TypeScript 2.1,但您应该使用 2.2 或更高版本,因为索引访问类型的许多方面都已改进。
如果您在模块内部,请将上述代码的上述
interface
部分包装在declare global {...}
块中。