「TypeScriptの型入門」で手を動かす - その12
本日は「TypeScriptの型入門」の「typeof」から手を動かします!
typeof
typeof 変数
と書くと、その変数の型が得られる
keyof
- いよいよTypeScriptのよくわからないところらしい。。
- ある
T
を型とすると、keyof T
という型の構文がある。keyof T
は「T
のプロパティ名全ての型」
kyeof T
は型として使えるのか- T型のプロパティ名を列挙したunion型かな。
interface MyObj { foo: string; bar: number; } let key: keyof MyObj; // 'foo' | 'bar'
プロパティがsymbol
- プロパティ名はシンボルの可能性もある
- keyof型はシンボルの型を含む可能性がある
keyof ( typeof obj)
でシンボル型を含むユニオン型を得られる’foo’ | typeof symb
となる。symbol型ではない。シンボルは一つずつ異なるため
プロパティがnumberの部分型
- keyof型には
number
の部分型含まれる場合もある。- 数値リテラルを使ってプロパティを宣言した場合
- JSではプロパティ名に数値は使えない。勝手に文字列に変換される。
- TypeScriptでは数値をプロパティ名に使用した場合は型の上ではそれを保つ
プロパティがインデックスシグネチャのとき
[foo: string]: number
のとき、keyof はstring | number
になる- numberでもどうせstringに変換されるから
[foo: number]: number
のときは、keyof はnumber
になる
Lookup Types T[K]
- keyofとセットで使われることが多い
- Kがプロパティ名の型であるとき、T[K]はT型のそのプロパティの型
- keyofがプロパティ名の型を取得する構文だから一緒に使われるんだろうな
- MyObj型にfooプロパティがあり、fooプロパティはstring型の場合
- MyObj['foo']型はstring型
- Kはkeyof Tの部分型である必要がある。Tのプロパティ名の型なので
今日はここまで、次は「Mapped Types」から手を動かします!
残りわずかかな。もうひと踏ん張り頑張ろう!