カラーコードの 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}`; // Expression produces a union type that is too complex to represent