首页 > 解决方案 > 休息/传播参数类型

问题描述

对于这段代码:

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 个或更多。

如何以类型安全的方式解决此问题?回退到callback.apply(null, args)ES6 感觉不对。

请注意,可能不是 2 个参数,而是 10 个参数,因此枚举它们不是一个好的选择。

标签: typescript

解决方案


目前,您所能得到的只是类型不安全的令人讨厌的解决方法。从 TypeScript 3.0 开始,应该很快(2018 年 7 月)发布,您将能够在休息/传播位置使用元组。如果您现在想尝试,可以使用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
});

在该代码中,您需要显式键入...argsParameters<Callback>因为它似乎不是从上下文中推断出来的(我想知道这是否应该是一个功能请求),但是您不必枚举任何内容,因为Parameters<Callback>这正是您想要使用的类型.

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


推荐阅读