iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0

當參數為值

TypeScript 可以為函式的參數指定型別:

function add(a: number, b: number) {
  const sum = a + b
  console.log(sum)
}

TypeScript 也可以指定函式 return 內容的型別,以上面的例子來說,我們並沒有 return 任何東西,因此我們可以在 return 型別的部分使用 void

function add(a: number, b: number): void {
  const sum = a + b
  console.log(sum)
}

當有 return 值時,我們可以指定型別也可以不指定型別,因為 TypeScript 會自動幫我們推斷 return 內容的型別:

function add(a: number, b: number): number {
  const sum = a + b
  return sum
}

或是

function add(a: number, b: number) {
  const sum = a + b
  return sum
}

當參數為函式

函式型別指定的語法看起來與箭頭函式類似,但它實際上是 TypeScript 用來指定函式型別的一種語法。
在下面的例子中,我們新增了一個傳入的函式 fn,我們一樣需要為這個函式的參數指定型別,箭頭後指的則是 return 的型別:

function calculate(a: number, b: number, fn: (a: number, b: number) => number) {
  return fn(a, b)
}

搭配我們先前的例子,合併後的完整程式碼如下:

function add(a: number, b: number) {
  const sum = a + b
  return sum
}

function calculate(a: number, b: number, fn: (a: number, b: number) => number) {
  return fn(a, b)
}

calculate(1, 2, add) // 3

【 補充 】為什麼沒有 return 值時不將型別設為 undefined?

這邊稍微解釋為什麼我們不把型別設為 undefined,像是這樣:

function add(a: number, b: number): undefined {
  const sum = a + b
  console.log(sum)
}

在我們的例子中,以及實務上的應用,不設為 undefined 有以下幾個主要的原因:

  1. void 的語義更清晰:
    void 在 TypeScript 中表示「沒有返回值」,這表明函式的設計意圖就是不返回任何東西,這是對開發者更直觀的表達。當我們看到 void 時,我們會立刻知道這個函式不會有明確的返回值。
    undefined,雖然技術上表示「沒有定義的值」,但它在 JavaScript 中是一個實際的值。當你用 undefined 作為返回型別時,實際上意味著函式的返回值必須是 undefined,而不是「沒有返回值」。這樣可能會誤導開發者認為函式實際上是返回了 undefined

  2. 避免潛在的誤解:
    在 JavaScript 中,函式不返回任何東西時,會默認返回 undefined。然而,使用 undefined 作為返回型別可能會讓人誤解該函式是故意返回 undefined,而不是因為沒有 return
    而使用 void 明確表示「函式不返回值」,避免了這種誤解。

  3. 實際應用上的區別:當你將 undefined 設為返回型別時,TypeScript 會強制要求函式明確返回 undefined,否則會報錯。因此,如果沒有明確的 return undefined,TypeScript 會視為不符合型別定義:

    function example(): undefined {
      return undefined; // 正常
    }
    
  4. 慣例和語義上的一致性:
    在 TypeScript 和其他強型別語言中,使用 void 來表示函式沒有返回值是一種通用的做法,這樣可以保持代碼的一致性和可讀性。


上一篇
【 Day 05 】Union & Object & Array
下一篇
【 Day 07 】Custom Types & Interface
系列文
React 開發者的 TypeScript 探索之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言