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'>, ''>>,
]
從以下幾個方向來思考:
infer
關鍵字從泛型中推導出型別。infer
來推斷剩餘的字串內容。解法:
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
,期待再相見!