Template Literal Typesはinferを組みあわせると色々遊べるのです。 Fukuoka.ts #3 の発表資料です。
参考資料 https://github.com/sindresorhus/type-fest
Template Literal Typesであそぶ松本 芳郎 / 株式会社マネーフォワードFukuoka TS #3
View Slide
自己紹介松本芳郎● 株式会社マネーフォワード 経費本部● フロントエンドエンジニア● 前職ではデザイナーでした● Twitter @bennkyougirai
発表内容Template Literal Types で遊ぶ!
Template literal Typeとは
Template literal Typeを利用してできること● JSのテンプレートリテラルと同じ書式で Literal Types を作成できる
Template literal Typeを利用してできること● JSのテンプレートリテラルと同じ書式で Literal Types を作成できる● Literal Typesから一部の文字列を抽出したりできる● String.splitみたいな型も作れるInferと組み合わせることで、
(1) Literal Typesから番号だけ抽出する● TS Playground → sample// => "39"type Result1 = IdNumber<'id-39'>type IdNumber = T extends `id-${infer U}`? U extends `${number}`? U : '': ''
(1) Literal Typesから番号だけ抽出する● TS Playground → sample// => "39"type Result1 = IdNumber<'id-39'>type IdNumber = T extends `id-${infer U}`? U extends `${number}`? U : '': ''① Literal Typesのなかでinferを使う② U はnumberであることを期待する
(2) Literal Typesを分割してArrayを作る● TS Playground → sampletype Split = S extends `${infer Head}${infer Tail}`? [Head, ...Split]: S extends ""? []: [S];// => ['H', 'e', 'l', 'l', 'o']type Result = Split<'Hello'>
(2) Literal Typesを分割してArrayを作る● TS Playground → sampletype Split = S extends `${infer Head}${infer Tail}`? [Head, ...Split]: S extends ""? []: [S];// => ['H', 'e', 'l', 'l', 'o']type Result = Split<'Hello'>① 文字を分割するために inferを2つ使う② 再帰させて文字を全て走査する
おまけ: Splitを使って文字数をカウント● TS Playground → sampletype ArrayLength = Arr['length']type StrLength = ArrayLength>// => 5type Result2 = StrLength<'Hello'>
(3) Camelcase → Snakecase// => my-friend-forevertype Result = CamelToSnake<'myFriendForever'>;● TS Playground → sample
(3) Camelcase → Snakecase● TS Playground → sample// 1. 隣あう2文字を使ってCamelCaseかどうか判定するtype IsCamelCase =Second extends "" ? false : First extends Lowercase? Second extends Capitalize ? true : false: false;
(3) Camelcase → Snakecase// 2. IsCamelCaseを利用してハイフンを挿入していくtype CamelToSnake =T extends `${infer Head}${infer Rest}`? Rest extends string? Rest extends ""? `${Prev}${Head}`: IsCamelCase extends true? CamelToSnake}${Head}-`>: CamelToSnake}${Head}`>: T: T
ちなみに● LowercaseやCapitalizeなどはTypeScriptがビルトインで提供してる○ https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#intrinsic-string-manipulation-types○
コツ● inferとTemplate Literal Types を組み合わせて推量対象の構造を作る● Arrayとことで自由度がます● 再帰を使う
最後に注意点● 再帰を多用するので、パフォーマンスに影響ある可能性が。● (検証してません)
参考資料● https://github.com/sindresorhus/type-fest
ご静聴ありがとうございました。