網站搜尋

javascript - 我能用 TypeScript 使用展開語法創建一個包裝函數,而不必指定參數和類型嗎?


以下程式碼是一種在 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);
}