🦁
【 TypeScript 】"as"と"&"を使って詳しい型情報を提供する
次のようなコールバック関数を作成したとします。
const getMyPet = () =>
document.documentElement.getAttribute('myPet')
// const getMyPet: () => string | null
関数の戻り値はstring | null
となっています。しかし引数でmyPet
を指定しているので、戻ってくる値は何かしらの具体的な文字列の可能性があります。
事前に次の型を作成していたとします
type MyPet = 'tama' | 'pochi'
getMyPet()
の戻り値の型にMyPet
も含める方法について考えます。
まず、as
を使って戻り値の型を指定してみましょう。
const getMyPet = () =>
document.documentElement.getAttribute('myPet') as MyPet
// const getMyPet: () => MyPet
MyPet
型を指定することができました。しかし null
型が失われているので補いましょう。
const getMyPet = () =>
document.documentElement.getAttribute('myPet') as MyPet | null
// const getMyPet: () => MyPet | null
ただこのままでは、後で型情報を参照したときMyPet
型の具体的な中身である'tama' | 'pochi'
が表示されません。そこでIntersection型:&
を使ってTypescriptに詳細情報を表示させましょう。
const getMyPet2 = () =>
document.documentElement.getAttribute('myPet') as (MyPet & {}) | null
// const getMyPet2: () => "tama" | "pochi" | null
(MyPet & {})
の箇所は (MyPet & string)
としても同じ型が得られます。
Intersection型の詳細は公式ドキュメントを見てください。
このままでも十分な気もするのですが、'tama','pochi'
以外の文字列も戻ってくる可能性も残しておきましょう。
const getMyPet3 = () =>
document.documentElement.getAttribute('myPet') as (MyPet & {}) | null | (string & {})
// const getMyPet3: () => "tama" | "pochi" | (string & {}) | null
(string & {})
を加えることで、"tama" | "pochi"
以外の文字列だった場合の条件式を作成するヒントが得られます。
以上です。
今回の例は TS playground で確認できます。
Discussion