mosya<TC> - LengthOfString型を実装して文字列の長さを型として取得しようの解説
この記事はmosya<TC>の問題の一つであるLengthOfString型の解説になります。
問題
String#length
と同じように、文字列リテラルの長さを計算します。
例えば、以下のようなコードを満たすように実装しましょう。
type Length = LengthOfString<"hello">; // 5
解答例
type StrToArray<S> =
S extends `${infer x}${infer xs}`
? [1, ...StrToArray<xs>]
: [];
type LengthOfString<S extends string> =
StrToArray<S>["length"];
文字列を配列に変換する型を作る
まず、StrToArray
という型を作成します。
文字列を配列に変換する型です。
以下の手順で文字列を配列に変換していきます。
- 文字列リテラルと
infer
を使って、代入されたS
を最初の文字であるx
とそれ以降の文字であるxs
に分割します。 - 分割できる場合は、
[1, ...StrToArray<xs>]
という配列を返し、再度、StrToArray
を呼び出し、残りの文字であるxs
に対して同じ処理を行います。 - これ以上分割できなくなった場合は、
[]
という空の配列を返します。
これにより例えばStrToArray
に"hello"
という文字が代入された場合以下のような配列になります。
type Foo = StrToArray<"hello">; // [1, 1, 1, 1, 1]
配列の長さを取得する
次に、LengthOfString
という型を作成します。
文字列の長さを取得する型です。
先ほど作成したStrToArray
を使って、文字列を配列に変換し、その配列の長さを取得します。
type LengthOfString<S extends string> =
StrToArray<S>["length"];
Authored by
Godai@steelydylan
Webサービスを作るのが好きなWebエンジニア。子供が産まれたことをきっかけに独立し法人化。サービス開発が大好き。
好きな言語はTypeScript。