我已经扩展了EventEmitter类并使用了函数重载,以便在使用特定字符串调用addListener时,回调将自动键入:
const codes = {
code1: 'code1',
code2: 'code2',
} as const;
type CodeType = typeof codes;
interface Code1Interface { a: string };
interface Code2Interface { b: boolean };
class MyEmitter { // extends ...
public addListener(code: CodeType['code1'], callback: (event: Code1Interface) => void): void;
public addListener(code: CodeType['code2'], callback: (event: Code2Interface) => void): void;
public addListener(code: CodeType[keyof CodeType], callback: (event: any) => void): void; // fallback
public addListener(code: any, callback: any) {
// call the parent addListener here
}
}
但是,我有一个函数可以将addListener封装到Promise中,而TypeScrip无法猜测返回类型:
function getEvent(code: CodeType[keyof CodeType]) { // returns Promise<unknown>
return new Promise((resolve, reject) => {
const emitter = new MyEmitter();
emitter.addListener(code, (event) => resolve(event));
})
}
getEvent(codes.code1).then(x => x) // x has type unknown
是否可以将函数重载中定义的接口类型转发给getEvent函数的调用方,或者执行可以在MyEmitter类中重用的更一般的映射?
demo个