休息/扩展参数类型

时间:2018-07-06 12:50:31

标签: typescript

对于这段代码:

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个,因此枚举不是一个好选择。

1 个答案:

答案 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>正是您要使用的类型。

希望(最终)有所帮助。祝你好运。