参考: https://stackoverflow.com/questions/45251664/typescript-derive-union-type-from-tuple-array-values
TypeScript 3.4 で組み込まれた as const
を使ってより簡潔に実装できるようになった
const directionList = ['east', 'west', 'south', 'north'] as const
// -> Readonly ['east', 'west', 'south', 'north']
type Direction = typeof directionList[number]
// -> 'east' | 'west' | 'south' | 'north'
独自定義の Type Guard と組み合わせたりするのに便利そう
const isDirection = (obj: any): obj is Direction => {
return directionList.includes(obj)
}
const doSomething = (data: any) => {
// validation
if (!isDirection(data.direction)) {
throw new Error('direction is not found')
}
// do something
}