カラーコードの Template Literal Types(敗北編)
2021-10-06 日報。
- カラーコードのリテラル型が作りたかった
- '#' から始まる 6 桁の 0-9A-Fa-f
- template literal types で作れるんじゃね?と思った
- f_subal さんからの案
- 愚直に各桁で出てくる文字の UnionType で 6 桁分埋める
- 5 個めで UnionType が複雑すぎるというエラーになった
Expression produces a union type that is too complex to represent
- 同じような要件で GUID を型で表現したいというもの
- https://teratail.com/questions/342468
- 同じく複雑すぎる UnionType としてエラーになる
- 4 桁から 5 桁に増やすとパターンが 61443 個増える
- 5 桁から 6 桁で組合せ爆発の許容閾値を超えるっぽい
- 結局諦めて内部で Type Guard するに落ち着いた
- 記法として実現できないわけじゃないので、正規表現で型が導出できるようになったとしても解決しなさそう
- むしろ正規表現で出来ちゃうとパターンが多すぎるという理由で実装されてないのかもしれない
type HEX = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f;
type ColorCode =
| `#${HEX}${HEX}${HEX}`
| `#${HEX}${HEX}${HEX}${HEX}${HEX}${HEX}`;