我可以使用扩展语法使用 TypeScript 制作包装函数,而无需指定参数和类型吗?

Posted

技术标签:

【中文标题】我可以使用扩展语法使用 TypeScript 制作包装函数,而无需指定参数和类型吗?【英文标题】:Can I make a wrapper function with TypeScript using spread syntax, without having to specify arguments and types? 【发布时间】:2020-07-01 15:12:17 【问题描述】:

以下代码是在 javascript 中实现包装函数的一种常见且非常简洁的方式。

代码用包装器outerFunction 包装innerFunction(有一些命名参数):

function innerFunction(firstArgument, secondArgument, thirdArgument) 
  console.log('innerFunction', arguments);


function outerFunction() 
  console.log('outerFunction', arguments);
  innerFunction(...arguments)


outerFunction(1, 2, 3);

这和 JavaScript 一样工作得很好 - 你可以看到 outerFunction 将任何参数传递给 innerFunction

outerFunction [Arguments]  '0': 1, '1': 2, '2': 3 
innerFunction [Arguments]  '0': 1, '1': 2, '2': 3 

Typescript 不喜欢这样,因为它希望我将内部函数类型放入外部函数中。

在 TypeScript 中是否有更好的方法?肯定 TypeScript 的静态分析可以看到外部函数从内部函数获取其类型?

我接受答案可能是“不,您必须将内部函数的类型添加到外部函数”。但如果有更好的方法,我想在这里咨询一下我的同行。

【问题讨论】:

【参考方案1】:

Typescript 提供了一个实用程序类型Parameters,它以元组的形式为您提供函数参数的类型。所以你可以像下面这样输入外部函数:

function innerFunction(firstArgument: string, secondArgument: number, thirdArgument: boolean) 
  console.log('innerFunction', firstArgument, secondArgument, thirdArgument);


function outerFunction(...args: Parameters<typeof innerFunction>) 
  console.log('outerFunction', ...args);
  innerFunction(...args);

【讨论】:

我的错;编辑添加“typeof”,我认为应该这样做。

以上是关于我可以使用扩展语法使用 TypeScript 制作包装函数,而无需指定参数和类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 无法在扩展语法函数调用中推断数组类型

Typescript 类型推断、扩展语法和多类型返回

对类方法使用胖箭头语法时,我可以使用 TypeScript 重载吗?

搭建node服务:使用TypeScript

Typescript 01 安装与使用

TypeScript语法学习