LoginSignup
2
1

More than 1 year has passed since last update.

TypeScriptで日付文字列(YYYY-MM-DD)の型を作る

Last updated at Posted at 2022-05-26

なにがしたいか

2022-06-0122/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|91|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}`;

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1