iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
JavaScript

TypeScript Type Challenges 冒險篇章:30 天闖關之旅,type 簡單了?你確定?系列 第 9

第9關:If!TypeScript可惜沒如果:boolean世界,非黑即白

  • 分享至 

  • xImage
  •  

第9關:If

關卡簡介

Implement the util type If<C, T, F> which accepts condition C, a truthy value T, and a falsy value F. C is expected to be either true or false while T and F can be any type.

實現一個工具型別 If<C, T, F>,它接收條件 C,一個為真時的值 T,以及一個為假時的值 F。C 預期為 true 或 false,而 T 和 F 可以是任意型別。

任務說明:

type A = If<true, 'a', 'b'>  // expected to be 'a'
type B = If<false, 'a', 'b'> // expected to be 'b'

接下來,你的任務是讓下面的type cases測試通過:

type cases = [
  Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a'>, 'b' | 'c'>>,
  Expect<Equal<MyExclude<'a' | 'b' | 'c', 'a' | 'b'>, 'c'>>,
  Expect<Equal<MyExclude<string | number | (() => void), Function>, string | number>>,
]

冒險指南:

在這一關中,我們可以從以下幾個方向來思考:

  1. 如何確保 C 僅限於 true 或 false ?
  2. 如何返回正確的類型 T 或 F?

我們將會用到:

  1. extends:用於條件類型中,檢查一個類型是否符合另一個類型的約束。如果符合,則返回相應的類型;否則返回另一個類型。常用於檢查類型的兼容性。
extends 在第三關已經介紹過,可以回到第三關參考喔!

通關方式:

解法:

type If <C extends boolean,T,F >  = C extends true?  T : F
type A1 = If<true, 6, 3>    // 6
type A2 = If<false, 6, 3>   // 3
type A3 = If<5, 6, 3>       // 3

細節分析:

  • C extends true ? T : F

這是 TypeScript 中的條件類型語法,根據 C 是否為 true,返回不同的類型。當 C 是 true 時,返回 T;如果 C 是 false,則返回 F。這是我們實現 If 工具類型的核心邏輯。

  • 為什麼使用 extends

extends 關鍵字用於條件類型檢查。當 C 是 true 時,它會匹配條件,並返回 T;否則會返回 F。這裡的 C extends true 表示檢查 C 是否符合 true 這個類型的條件。

  • 限制 C 為 boolean 的意義:

在我們的例子中,C 被限制為 boolean 值,這確保了 If 工具類型只會接受 true 或 false 作為 C 的值。如果我們不加這個限制,像 5 這樣的非布林值也能被傳入,但這不符合預期。

延伸問題:
請問 這裡 A4 hover上去結果會是如何呢?
https://ithelp.ithome.com.tw/upload/images/20240923/201687894GdiOUCx6R.png
解答:
https://ithelp.ithome.com.tw/upload/images/20240923/20168789YfCOT583s3.png

  • 分析:因為 C 的類型是 boolean,它可以是 truefalse 的任何一個,所以 TypeScript 會將 C 視為可能是兩者的 union type (聯合類型) true | false。在這種情況下,C 既可以符合 true,也可以符合 false,所以結果會是 T | F,也就是 6 | 3

這樣,我們就能順利通過測試啦 🎉 😭 🎉

總結:

本次介紹了 If 的實作,下一關會挑戰 Concat,期待再相見!


上一篇
第8關:Exclude!TypeScript稽查員:不合格的全都出去
下一篇
第10關:Concat!TypeScript 陣列拼圖:合併出完美結局
系列文
TypeScript Type Challenges 冒險篇章:30 天闖關之旅,type 簡單了?你確定?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言