我正在尝试为打字稿创建一个严格类型化的事件发射器,但我不知道是否可能。
假设我为发射器创建了一个侦听器:
// 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);
有可能吗?
答案 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