LengthOfString<S>
文字列を引数にとって、その長さを返す
使用例
tstype A0 = LengthOfString<''>; // 0
type A7 = LengthOfString<'mrsekut'>; // 7
type A16 = LengthOfString<'Sound! Euphonium'>; // 16
考え方のポイント
イメージ的にはこういうことをしたい
tstype LengthOfString<S extends string> =
S extends `${infer H}${infer Tail}`
? 1 + LengthOfString<Tail>
: 0;
1文字ずつ消化しつつ、結果( number
)を1ずつインクリメントして再帰すればいい
しかし、型レベルの数値演算はできないので、それに代わる方法を考える必要がある
再帰の度に配列の要素を追加していき、最終的に strArr['length']
で長さを取ればいい
定義例1
tstype LengthOfString<S extends string> = StrToArray<S>['length'];
type StrToArray<S extends string> =
S extends `${infer H}${infer Tail}`
? [H, ...StrToArray<Tail>]
: [];
ちなみに、 StrToArray
の結果はこんな感じ
tstype A = StrToArray<'mrsekut'>; // ["m", "r", "s", "e", "k", "u", "t"]
定義例2
tstype LengthOfString<S extends string, L extends unknown[] = []> =
S extends `${infer H}${infer R}`
? LengthOfString<R, [H, ...L]>
: L['length'];
2つの型引数を使って、1つの型定義で、定義例1と同じことをしている