わいの日記

ありがちエンジニアブログ

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みがある気がする

amzn.to

amzn.to