iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
JavaScript

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

第22關:Trim!TypeScript 剪刀手:移除字串頭尾空白

  • 分享至 

  • xImage
  •  

第22關:Trim

關卡簡介

Implement Trim<T> which takes an exact string type and returns a new string with the whitespace from both ends removed.

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

任務說明:

type trimmed = Trim<'  Hello World  '> // expected to be 'Hello World'

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

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

冒險指南:

從以下幾個方向來思考:

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

通關方式:

解法:

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

細節分析:

  • Space 是我們定義的字串聯合類型,包含空白字符(空格、\t\n)。這些是我們要移除的字符。

  • Trim<S> 檢查字串是否符合以下兩種模式之一:

    1. `${Space}${infer R}`:這會匹配字串以空白字符開頭的情況,並推斷出剩餘的字串 R
    2. `${infer R}${Space}`:這會匹配字串以空白字符結尾的情況,並推斷出剩餘的字串 R
    • 如果字串符合這兩種模式之一,我們會遞迴地調用 Trim<R> 來繼續移除空白字符,直到字串不再符合條件為止,最後返回結果。

額外補充:
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 的實作,下一關會挑戰 Capitalize,期待再相見!


上一篇
第21關:Trim Left!TypeScript 左撇剪刀手:移除字串開頭空白
下一篇
第23關:Capitalize!TypeScript 字母哥:把第一個字母變成大寫
系列文
TypeScript Type Challenges 冒險篇章:30 天闖關之旅,type 簡單了?你確定?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言