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;
}

备注:

  1. 这需要 TypeScript 2.1,但您应该使用 2.2 或更高版本,因为索引访问类型的许多方面都已改进。

  2. 如果您在模块内部,请将上述代码的上述 interface 部分包装在 declare global {...} 块中。