Replace<S, Froms, To>
文字列 S
内の、 Froms
を、 To
に変換する
使用例
tstype _ = Replace<`a,b,c`, ['a','b'], 'x'>; // 'x,x,c'
type _ = Replace<`hogepiyo`, ['hoge'], ''>; // 'piyo'
type _ = Replace<`a,b,c`, [], 'x'>; // 'a,b,c'
定義
tstype 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
も不要であって欲しい

Replace1
は、 From
を To
に変換する
初期値が S
配列が Froms
関数が Replace1
参考
119が ReplaceAll
という名前なのは、別に Replace
という型もあるから
↑この文脈での Replace
は、 From
を1回だけ置換、Allの方は全て置換という意味
このノートとは名前がズレていることに注意

今見たらなんか119消えてるな
