generated at
Replace<S, Froms, To>
文字列 S 内の、 Froms を、 To に変換する


使用例
ts
type _ = Replace<`a,b,c`, ['a','b'], 'x'>; // 'x,x,c' type _ = Replace<`hogepiyo`, ['hoge'], ''>; // 'piyo' type _ = Replace<`a,b,c`, [], 'x'>; // 'a,b,c'


定義
ts
type Replace< S extends string, Froms extends string[], To extends string > = Froms extends [infer H extends string, ...infer Tail extends string[]] ? Replace<Replace1<S, H, To>, Tail, To> : S; // prettier-ignore type Replace1< S extends string, From extends string, To extends string > = From extends '' ? S : S extends `${infer F}${From}${infer L}` ? `${F}${To}${Replace1<L, From, To>}` : S;
Replace は、 Replace1 を繰り返し適用する
この書き方はv4.7からできる
v4.6以前はConditional Typesを追加で2回書かないといけなかったref
しかし、引数部分で既にextendsしているのだから、理想的には infer...extends も不要であって欲しいmrsekut
Replace1 は、 From To に変換する



Replaceの実装自体は、TypeScriptの型レベルfoldという感じがある
初期値が S
配列が Froms
関数が Replace1


参考
type-challenges 119 Replace1 の方がある
119が ReplaceAll という名前なのは、別に Replace という型もあるから
↑この文脈での Replace は、 From を1回だけ置換、Allの方は全て置換という意味
このノートとは名前がズレていることに注意mrsekut
今見たらなんか119消えてるなmrsekut