对于这段代码:
type Callback = (err: Error | null, result: String) => void;
let apiThatAcceptsCallback = (cb: Callback) => { /*...*/ };
function callback(err: Error | null, result: String) {}
apiThatAcceptsCallback((...args) => {
console.log(args);
callback(...args);
});
callback(...args)
导致错误:
预期有2个参数,但有0个或更多。
如何以类型安全的方式解决此问题?在ES6中退回到callback.apply(null, args)
感觉很错。
请注意,可能不是2个参数,而是10个,因此枚举不是一个好选择。
答案 0 :(得分:3)
就目前而言,您所能获得的只是麻烦的解决方法,这些解决方法类型不安全。从应该quite soon (July 2018)出现的TypeScript 3.0开始,您将能够使用tuples in rest/spread positions。如果您现在想尝试,可以使用typescript@next
。
一旦降落,您将可以执行以下操作:
// turn a function's parameters into a tuple, might be in standard library
type Parameters<T extends Function> = T extends (...args: infer U) => any ? U : any[];
apiThatAcceptsCallback((...args: Parameters<Callback>) => {
console.log(args);
callback(...args); // no error
});
在该代码中,您需要明确地将...args
键入为Parameters<Callback>
,因为它似乎不是从上下文中推断出来的(我想知道这是否应该是功能请求),但是您不需要必须枚举任何东西,因为Parameters<Callback>
正是您要使用的类型。
希望(最终)有所帮助。祝你好运。