🎃

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"

参考

https://typescript-jp.gitbook.io/deep-dive/type-system/literal-types

最後に

色々と調べてまとめようとしたが、よくわからなくなりました!なのでわかったところだけまとめておきました。
そもそもユニオン型についての理解が浅いかもしれません、
のちのち大事になりそう。

GitHubで編集を提案

Discussion