「TypeScriptの型入門」で手を動かす - その12

本日は「TypeScriptの型入門」の「typeof」から手を動かします!

qiita.com

プレイグラウンドで手を動かす

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」から手を動かします!

残りわずかかな。もうひと踏ん張り頑張ろう!