我正在尝试提出以下js方法的完全类型安全的版本:
const wrap = (ctor, props, name) => {
const obj = new ctor(props);
return (...args) => obj[name](...args);
};
我得出以下结论:
type MethodNames<T> = { [K in keyof T]: T[K] extends () => unknown ? K : never }[keyof T];
const wrap = <T, U, N extends MethodNames<T> & string>(ctor: new(props: U) => T, props: U, name: N) => {
const obj = new ctor(props);
return (...args: Parameters<typeof obj[name]>) => obj[name](...args);
};
显然,打字稿编译器未检测到obj[name]
必须是一个函数,这就是为什么它标记表达式Parameters<typeof obj[name]>
的原因。
问题是:如何以完全类型安全的方式定义此函数?