TypeScript (Type Guards、Discriminated Unions)
TypeScriptいろいろできるなー
Type Guards
たとえばstring型の数字か,numberの数字を引数に取る想定した場合とかに有効かな
const argNumberOrString = (value: string | number): void => { value.toString() // ここはセーフ value.toFixed() // ここでvalueはstring型と見なされ、toFixedなんてstringにはないよとエラーになる // Type Guardsでそれぞれの型が合うように条件分岐させる if (typeof value === 'string') { value.toString() } if (typeof value === 'number') { value.toFixed() } }
Discriminated Unions
literal型のメンバを使用して、ユニオン型のメンバを特定するのに役立つ
今回はkindでDogかCatを判別できるようにする
>>|
// 文字列指定する
interface Dog {
kind: 'dog',
yelp: () => string
}
interface Cat {
kind: 'cat',
meow: () => string
}
type Pet = Dog | Cat; // Pet型はDogかCatのどちらか
const getVoice = (pet: Pet): string {
// Type Guard
switch (pet.kind) {
case 'dog':
return pet.yelp()
case 'cat':
return pet.meow()
default:
return 'hoge'
}
}
|
switch文で書くとなんとなくreduxのreducerみがある気がする