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。
Related









