事件发射器收到的检查类型

时间:2019-12-22 16:12:46

标签: typescript

我正在尝试为打字稿创建一个严格类型化的事件发射器,但我不知道是否可能。

假设我为发射器创建了一个侦听器:

// create listener
@listen('my-custom-event')
function userListener(data: IUser){
  // do something
}

然后,我希望打字稿检查是否正在发送IUser数据。

// success
myEmitter.emit('my-custom-event', myUser as IUser);

// should return an error
myEmitter.emit('my-custom-event', myNonUser);

有可能吗?

1 个答案:

答案 0 :(得分:2)

有可能。 Typescript可以在编译时检查方法类型。您应该使用eventName-type关系创建一个地图。看看下面的代码。

     interface User {
       name: string
     }

     type EmittrMap = {
       'my-custom-event': User;
       'my-custom-event-2': number;
     }

     export class Emitter {
       // some magic line below. It's very useful pattern for inferring method types
       emit<T extends keyof EmittrMap>(eventName: T, arg: EmittrMap[T]) {
         console.log(eventName, arg)
       }
     }

     const myEmitter = new Emitter

     myEmitter.emit('my-custom-event', {name: 'Henry'}) // doesn't fail

     myEmitter.emit('my-custom-event', {age: 10}) // it fails in compile time, 
     // as expected