項目8 型空間のシンボルと値空間のシンボルの見分け方を知る
TypeScriptにおけるシンボルは以下の2つが存在し、同じ名前のシンボルでも空間によって異なる
型空間
JavaScriptにコンパイルすると削除される
値空間
シンボルの空間認識違いによってエラーが発生する可能性がある
code:typescript
// 型空間
interface Cylinder {radius: number; height: number;}
// 値空間
const Cylinder = (radius: number, height: number) => ({radius, height})
// instanceof Cylinderは値空間のCylinderを参照する
function calculateVolume(shape: unknown) { if (shape instanceof Cylinder) { ... }}
classとenumは型と値の両方を導入する
型として扱えるが、JavaScriptにコンパイル後でも値として扱える
型 or 値の文脈によって異なる意味を持つ演算子やキーワードがある
typeof
型の文脈
値を受け取り、TypeScriptにおける型を返す
値の文脈
typeof演算子が返しうる値( TypeScriptの型とは異なる)
string, number, boolean, undefined, object, function, symbol, bigint
[]
型空間
型のプロパティにアクセスするにはobj['first']をつかう
[]の中には様々な型を入れれる
code:ts
値空間
obj['field'] は obj.field のどちらでもプロパティにアクセスできる
this
型空間
値空間
JavaScriptのthisキーワード
&, |
型空間
インターセクションとユニオン演算子
値空間
ビット積とビット和
const
型空間
as constはリテラルやリテラル式の推論結果の型を変更する
値空間
新しい変数を導入する
extends
型空間
サブタイプまたは、ジェネリック型の成約を定義
値空間
サブクラスの定義
in
型空間
マップ型で使われる
値空間
forループで使われる
!
型空間
値空間
JavaScriptの論理not演算子
メソッドの引数でも空間の使い分けを行う
code:ts
function email(
{to, subject, body}: {to: Person, subject: string, body: string}
) { ... }