iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
JavaScript

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

第21關:Trim Left!TypeScript 左撇剪刀手:移除字串開頭空白

  • 分享至 

  • xImage
  •  

第21關:Trim Left

關卡簡介

Implement TrimLeft<T> which takes an exact string type and returns a new string with the whitespace beginning removed.

實現 TrimLeft<T>,該泛型接受一個精確的字串類型,並返回一個去除開頭空白的新的字串。

任務說明:

type trimed = TrimLeft<'  Hello World  '> // expected to be 'Hello World  '

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

type cases = [
  Expect<Equal<TrimLeft<'str'>, 'str'>>,
  Expect<Equal<TrimLeft<' str'>, 'str'>>,
  Expect<Equal<TrimLeft<'     str'>, 'str'>>,
  Expect<Equal<TrimLeft<'     str     '>, 'str     '>>,
  Expect<Equal<TrimLeft<'   \n\t foo bar '>, 'foo bar '>>,
  Expect<Equal<TrimLeft<''>, ''>>,
  Expect<Equal<TrimLeft<' \n\t'>, ''>>,
]

冒險指南:

從以下幾個方向來思考:

  • 型別推斷 (Type Inference):使用 infer 關鍵字從泛型中推導出型別。
  • 陣列解構與推斷 (Array Destructuring with Inference):我們的目標是從字串中移除開頭的空白字符。可以利用 TypeScript 的字串模板字面型別 (Template Literal Types) 和擴展操作符 (Spread Syntax) 來逐步移除空白字符,並用 infer 來推斷剩餘的字串內容。
  • 邊界情況處理 (Edge Case Handling):記得要考慮空字串或純空白字符的情況。當字串為空時,應返回空字串,避免出現錯誤。

通關方式:

解法:

type Space = '\t' | '\n' | ' '
type TrimLeft<S extends string> = S extends `${Space}${infer Rest}` ? TrimLeft<Rest> : S

細節分析:

  • 條件型別 (Conditional Types):使用條件型別來根據字串是否以空白字符開頭決定後續操作。在這裡,條件型別的結構為 S extends ${Space}${infer Rest} ,如果符合條件,則會繼續遞迴處理剩餘的字串 Rest,直到不再有空白字符為止。

  • S extends ${Space}${infer Rest}:若字串 S 以空白字符開頭,則推斷出剩餘部分 Rest,並遞迴處理它。如果條件為假,即字串不再以空白字符開頭,則返回該字串,這時候就已經去除了開頭的空白字符。

  • 型別推斷 (Type Inference):通過 infer 關鍵字推導出字串中去除空白字符後的剩餘部分,這是 TypeScript 中處理字串字面型別時非常有用的技巧。

  • 邊界情況 (Edge Cases):當字串為空或純由空白字符組成時,條件型別會返回空字串,這樣就能妥善處理這些特殊情況,避免出現不預期的行為。

額外補充:
Escape sequences are special combinations of characters that start with a backslash () followed by another character to represent things like tabs, newlines, and other non-printable or special characters in a string. For example:

\t represents a tab.
\n represents a newline.
\\ represents a literal backslash.
\" represents a double quote.

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

總結:

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


上一篇
第20關:Pop!TypeScript Popping 舞王:震掉最後一個元素
下一篇
第22關:Trim!TypeScript 剪刀手:移除字串頭尾空白
系列文
TypeScript Type Challenges 冒險篇章:30 天闖關之旅,type 簡單了?你確定?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言