なにがしたいか
2022-06-01
や22/06/01
など特定の形式の文字列だけ許容したい。
やりかた
テンプレートリテラルタイプを使用する。
下記のように特定の形式のみ許容できる型が作れます
type Lang = '日本語' | '英語'
type LangTemplate = `母国語は${Lang}です` // Template literal type
const okLang: LangTemplate = `母国語は日本語です` // ok
const errLang: LangTemplate = `母国語はhogehogeです` // error
これを利用します。
まずは年を定義します。
type YYYY = `20${0|1|2|3|4|5|6|7|8|9}${0|1|2|3|4|5|6|7|8|9}`
これによりyearは2000~2099に制限できました。
1900年代も含めたい場合19${0|1|2|3|4|5|6|7|8|9}${0|1|2|3|4|5|6|7|8|9}
を追加します。
次に月を定義します。
月は01~12までしかありませんので下記のように定義します。
type MM = `0${1|2|3|4|5|6|7|8|9}` | `1${0|1|2}`
次に日付です。
日付は01~31です。
type DD = `${0}${1|2|3|4|5|6|7|8|9}` | `${1|2}${zeroToNine}` | `3${0|1}`
そして、定義したこれらを使用して、YYYY-MM-DD
の形式の型を作成します
type YYYYMMDD = `${YYYY}-${MM}-${DD}`;
これで日付文字列だけ許容する型を作成できました。
あとは、0|1|2|3|4|5|6|7|8|9
や1|2|3|4|5|6|7|8|9
の共通化できるものなどをまとめたら完成です。
type oneToNine = 1|2|3|4|5|6|7|8|9
type zeroToNine = 0|1|2|3|4|5|6|7|8|9
type YYYY = `19${zeroToNine}${zeroToNine}` | `20${zeroToNine}${zeroToNine}`
type MM = `0${oneToNine}` | `1${0|1|2}`
type DD = `${0}${oneToNine}` | `${1|2}${zeroToNine}` | `3${0|1}`
type YYYYMMDD = `${YYYY}-${MM}-${DD}`;
参考