技術とかの雑なToday I Learnedメモ

HH:mmを表すstringの値を型で表現する

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を定義できるビルトインの型を用意してもらえたりしないかな〜と思ったりした。