0Pricing
TypeScript Academy · レッスン

型レベルの文字列分割

型システム内で文字列をタプルに分割します。

「型レベルの文字列分割」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

テンプレートリテラル型

型システムでは、テンプレートリテラル型とinferを組み合わせて、文字列リテラル型に対してパターンマッチングを行えます。これは型レベルの文字列解析における中核的なツールです。

表記: 実際の TypeScript では、テンプレートリテラル型を、ドル記号と波括弧の穴を含むバッククォートで囲まれた文字列として記述します。ここでのスニペットでは、そのパターンをTpl<...>として表し、各部分を順番に並べています。たとえば、リテラルのプレフィックスに続く Rest に一致するバッククォートテンプレートは、Tpl<'prefix', infer Rest>と表します。

type StartsWithA<S> = S extends Tpl<'a', string> ? true : false;
// Tpl<'a', string> is a backtick template literal type: 'a' then anything

type X = StartsWithA<'abc'>; // true
type Y = StartsWithA<'bcd'>; // false

サフィックスの推論

テンプレート内にinferを置くと、文字列の一部を取り出せます。ここでは、先頭の"a"より後にあるすべての部分を取り出します。

type AfterA<S> = S extends Tpl<'a', infer Rest> ? Rest : never;
// Tpl<'a', Rest> captures everything after a leading 'a'

type X = AfterA<'abc'>; // 'bc'

区切り文字で分割する

区切り文字の最初の出現箇所で文字列を分割するには、「先頭部分、区切り文字、末尾部分」というパターンに一致させ、両側を推論します。先頭部分の推論は左側から貪欲に行われるため、最初に一致したものが採用されます。

type SplitOnce<S, Sep extends string> =
  S extends Tpl<infer Head, Sep, infer Tail>
    ? [Head, Tail]
    : [S];
// Tpl<Head, Sep, Tail> matches up to the first separator

type X = SplitOnce<'a-b-c', '-'>; // ['a', 'b-c']

再帰的な分割

すべての部分に分割するには、末尾部分に対して再帰します。区切り文字がなくなるまで、各 Head をタプルに収集します。

type Split<S extends string, Sep extends string> =
  S extends Tpl<infer Head, Sep, infer Tail>
    ? [Head, ...Split<Tail, Sep>]
    : [S];
// recurse on Tail until no separator remains

type X = Split<'a.b.c', '.'>; // ['a', 'b', 'c']

再帰をたどる

Split<"a.b.c", ".">の処理をたどってみましょう。

  • Head は "a"、Tail は "b.c" -> ["a", ...Split<"b.c">]
  • Head は "b"、Tail は "c" -> ["b", ...Split<"c">]
  • "c" には "." がないため、基本ケース -> ["c"]

結果: ["a", "b", "c"] です。

type X = Split<"one,two", ",">; // ["one", "two"]
type Y = Split<"x/y/z", "/">; // ["x", "y", "z"]

空のセグメントを扱う

区切り文字が隣接していたり、端にあったりすると、分割によって空の文字列が生成されることがあります。パターンはその場合も一致し、空のHeadまたはTailを推論します。

type X = Split<"a,,b", ",">; // ["a", "", "b"]
type Y = Split<",a", ",">;   // ["", "a"]

再結合する

分割の逆操作は結合です。テンプレートリテラルを使い、文字列のタプルをたどりながら区切り文字で連結します。これは分割と自然に組み合わせられます。

type Join<T extends string[], Sep extends string> =
  T extends [infer H extends string, ...infer R extends string[]]
    ? R extends [] ? H : Tpl<H, Sep, Join<R, Sep>>
    : '';
// Tpl<...> denotes a template literal type concatenation

type X = Join<['a', 'b', 'c'], '-'>; // 'a-b-c'

空白のトリミング

文字列ユーティリティは組み合わせて使えます。Trim型は、テンプレート推論によって空白を繰り返し取り除き、先頭と末尾の空白を削除します。

type TrimLeft<S extends string> =
  S extends Tpl<' ', infer R> ? TrimLeft<R> : S;
type TrimRight<S extends string> =
  S extends Tpl<infer R, ' '> ? TrimRight<R> : S;
type Trim<S extends string> = TrimRight<TrimLeft<S>>;
// Tpl<' ', R> strips a leading space; Tpl<R, ' '> strips a trailing one

type X = Trim<'  hi  '>; // 'hi'

部分文字列の置換

Replace は、対象の前後で分割し、置換後の文字列で再結合することで機能します。これらはすべて、テンプレート推論と再帰によって実現します。

type ReplaceAll<S extends string, From extends string, To extends string> =
  S extends Tpl<infer A, From, infer B>
    ? Tpl<A, To, ReplaceAll<B, From, To>>
    : S;
// split around From, then rejoin with To via template literal types

type X = ReplaceAll<'a-b-c', '-', '_'>; // 'a_b_c'

分割が重要な理由

分割は構造化解析の基盤です。ルートは"/"で、クエリ文字列は"&"で、CSV の行は","で分割します。Splitを使うと、平坦な文字列型を、要素ごとに処理できるタプルへ変換できます。

type Segments = Split<"users/42/posts", "/">; // ["users", "42", "posts"]

深さに関する注意

型レベルの文字列再帰には、コンパイラーの深さ制限があります。非常に長い文字列や区切り文字が多い文字列では、この制限を超える可能性があります。パスや小規模なフォーマットなど、一般的な入力であれば問題なく動作します。

type Ok = Split<"a/b/c/d/e", "/">; // fine for small strings

理解度チェック

型レベルの文字列分割についての理解度を確認します。

まとめ

型だけを使って文字列を分割しました。

  • テンプレートリテラル型とinferによって、文字列の一部に一致させて取り出せます。
  • SplitOnceは最初の区切り文字で分割し、再帰によって完全なSplitになります。
  • Join、Trim、ReplaceAll は同じツールから組み立てられます。

次は、文字列型から構造化データを取り出します。

よくある質問

「型レベルの文字列分割」レッスンは無料ですか?

はい。「型レベルの文字列分割」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「型レベルの文字列分割」で何を学びますか?

型システム内で文字列をタプルに分割します。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「型レベルの文字列分割」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パーサーコンビネーターの概念
  2. 型レベルの文字列分割
  3. テンプレートリテラルによる解析
  4. 型レベルのミニルートパーサー
← TypeScript Academyに戻る