如何定义完全类型安全的包装函数?

时间:2019-03-18 20:32:03

标签: typescript

我正在尝试提出以下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]>的原因。

问题是:如何以完全类型安全的方式定义此函数?

0 个答案:

没有答案