HH:mm を表す string の値を型で表現する
'00:00'〜'23:59'
の文字列の型を TypeScript で表現したいな〜と思って調べた。
typescript - HH/MM の型を'01' | '02' | '03' | ... | '60'で定義する TypeScript の良い書き方募集 - スタック・オーバーフロー
なんか似たような質問がヒットしたのでこれを参考にしてみた。
type Concat<S1 extends number, S2 extends number> = `${S1}${S2}`
type SingleDigitalNumber = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
type HH = Concat<0 | 1, SingleDigitalNumber> | Concat<2, 0 | 1 | 2 | 3>
type MM = Concat<0 | 1 | 2 | 3 | 4 | 5, SingleDigitalNumber>
type HHMM = `${HH}:${MM}`
TypeScript4.1 から追加された Template Literal Types を使うと、こんな感じで定義できる。すげ〜〜〜
TypeScript 4.1 の Template Literal Types がやばい - Qiita
これがないと'00:00' | '00:01' | ...
みたいな書き方をしないといけないか、もしくは string 型で妥協してテストを厚くするしかないので、こういう便利な型が出てきてくれるのはとてもありがたい。
欲を言うと、正規表現の[0-9]
みたいな、↑ のSingleDigitalNumber
を定義できるビルトインの型を用意してもらえたりしないかな〜と思ったりした。