typescript 裡 `property?:` 跟 value 帶 `undefined` 的差別

claude 3.5 sonnet 回答令人驚豔!

typescript 裡 property?: 跟 value 帶 undefined 的差別

一直覺得好像差不多,但實際寫出來的程式碼常跟預期不同。 颱風天新血來潮想說來問一下 claude AI。 而它的回答令人驚豔!還用譬喻的方式馬上讓我瞭解當中差異。

問題

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
type A = {
  id?: string;
}

type B = {
  id: string | undefined;
}

type C = {
  id?: string | undefined;
}

以上三個 type 差別在哪個地方?

claude 3.5 sonnet 回答

很高興能為你解釋這三個 TypeScript 類型的差異。讓我們用輕鬆幽默的方式來看看這些類型,就像在登山時觀察不同的岩石一樣有趣!

  1. Type A: { id?: string; } 這就像是一個可選的登山裝備。你可以帶,也可以不帶。如果帶了,一定是繩子(string)。

  2. Type B: { id: string | undefined; } 這個就像是必須帶的登山背包,但裡面可能裝了繩子(string),也可能是空的(undefined)。你必須要背著這個包,但不確定裡面有沒有東西。

  3. Type C: { id?: string | undefined; } 這個就像是超級彈性的登山計劃。你可以選擇帶繩子,也可以選擇不帶任何東西,甚至可以帶個空盒子(undefined)。這是三個選項中最自由的!

主要差異:

  1. 可選性(Optionality):

    • Type A 和 C 中的 ? 表示 id 屬性是可選的。
    • Type B 中 id 是必須存在的屬性。
  2. 值的類型:

    • Type A 中,如果 id 存在,它必須是 string。
    • Type B 中,id 必須存在,但可以是 string 或 undefined。
    • Type C 中,如果 id 存在,它可以是 string 或 undefined。

實際使用時:

  • Type A: {}{ id: "abc" } 都是合法的。
  • Type B: { id: "abc" }{ id: undefined } 是合法的,但 {} 不合法。
  • Type C: {}, { id: "abc" }, 和 { id: undefined } 都是合法的。

總結來說,就像烹飪時選擇食材一樣,這三種類型給了我們不同程度的靈活性和限制。Type A 像是可選的調味料,Type B 像是必須的主菜(但可能是空盤子),而 Type C 則像是自助餐,想放什麼都行!

最後更新 Jul 24, 2024 14:37 +0800