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 个或更多。
如何以类型安全的方式解决此问题?回退到callback.apply(null, args)
ES6 感觉不对。
请注意,可能不是 2 个参数,而是 10 个参数,因此枚举它们不是一个好的选择。
解决方案
目前,您所能得到的只是类型不安全的令人讨厌的解决方法。从 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
});
在该代码中,您需要显式键入...args
,Parameters<Callback>
因为它似乎不是从上下文中推断出来的(我想知道这是否应该是一个功能请求),但是您不必枚举任何内容,因为Parameters<Callback>
这正是您想要使用的类型.
希望(最终)有所帮助。祝你好运。
推荐阅读
- python - why locate all on screen in pyautogui returns multiple similar results?
- javascript - How to display escaped HTML inside a code tag generated from markdown sanitized source?
- php - Regex to match four blocks ranges
- javascript - Discord虚荣狙击机器人错误:没有这样的文件或目录
- python - subprocess not working after onefile pyinstaller even with stdout/stdin defined
- java - ORA-02289: 序列不存在 Spring boot
- android - Does ARCore recording & playback degrade accuracy at all?
- javascript - 我怎样才能增加一个数组并让它从第一个索引开始?
- r - 在字段包中的 drape.plot 下绘制 image.plot?
- r - 无法使用 ggOceanMaps 放大?