🎃
TypeScript で特定の値しか受け付けない型を定義する
TypeScript を学習中です。
TypeScript の型として表現する際に、特定の値しか受け付けないようにしたかったので調べたことをまとめました。
結論
- 文字列リテラルとユニオンを組み合わせる
type Signal = 'safety' | 'alert' | 'danger'
let sig1: Signal = "safety"
let sig2: Signal = "alert"
let sig3: Signal = "Yoshi"
// sig3 だけエラー
enum like にする
上記のコードだと、Signal は文字列で指定する必要があることと、純粋な型のチェックにしか使用することができません。
下記のように、指定した文字列の配列から文字列リテラルのユニオン型を生成することで、オブジェクトとしても扱えるようになります
function strEnum<T extends string>(o: Array<T>): {[K in T]: K} {
return o.reduce((res, key) => {
res[key] = key;
return res;
}, Object.create(null));
}
const Signal = strEnum(['safety', 'alert', 'danger'])
// {
// "safety": "safety",
// "alert": "alert",
// "danger": "danger"
// }
type Signal = keyof typeof Signal
// "safety" | "alert" | "danger" 型
let sig1: Signal = Signal.alert
let sig2: Signal = "alert"
参考
最後に
色々と調べてまとめようとしたが、よくわからなくなりました!なのでわかったところだけまとめておきました。
そもそもユニオン型についての理解が浅いかもしれません、
のちのち大事になりそう。
Discussion