【发布时间】:2020-03-17 03:23:01
【问题描述】:
我正在尝试通过管道将 api 调用传递给通用方法。我需要能够推断参数,以便键入调度方法。
如果我要使用Parameters<T[K]> 类型,我需要使用dispatcher.dispatch(["this is my data", ... ]) 之类的所有参数进行调度调用,这也不是主要问题。
主要问题是我不能一般地推断参数是否是可选的。所以在下面的示例中dispatcher.dispatch() 中断。
class Dispatcher<T extends object, K extends FunctionKeys<T>, P = T[K] extends (p1: infer P) => void ? P : never> {
private readonly method: K;
private readonly filter: (listener: any) => boolean;
private readonly listenerResolver: () => any[];
constructor(method: K, listenerResolver: () => any[]) {
this.method = method;
this.listenerResolver = listenerResolver;
this.filter = (listener: any) => !!listener[this.method];
}
dispatch(arg: P) {
const listeners = this.listenerResolver();
listeners.filter(this.filter).forEach((listener: T) => listener[this.method](arg));
}
}
interface Listener {
action(data?: string): void;
}
const dispatcher = new Dispatcher<Listener, "action">("action", () => []);
dispatcher.dispatch("this is my data");
dispatcher.dispatch(); // this line does not compile
想法?
【问题讨论】:
标签: typescript typescript-generics