KDOC 554: 『Effective JavaScript』

この文書のステータス

  • 作成
    • <署名>
  • レビュー
    • <署名>

概要

なし。

メモ

  • すでに複数の異なるプログラミング言語を書き慣れている人にとっては新しい言語に取り組むさい、その言語特有の注意事項から学び始めるのは効果的である。それによって言語に対するメンタルモデルを鍛え上げるとともに言語の特徴を把握できる(まえがき)
  • TwoslashはTypeScriptのマークアップフォーマット
  • type Shape = Square | Rectangle の Rectangle は型だが、 shape instanceof Rectangle は値で、この場合はコンストラクタ関数を指す。型空間のシンボルと値空間のシンボルがある(p15)
    • よくわからない
  • 型エラーのあるコードからも出力が生成される。ほかの言語と異なるところ(p15)
  • 型演算は実行時の値に影響しない(p16)
  • 実行時の型は「宣言された型」と異なる可能性がある(p17)
    • TypeScriptの型なので、実行時には削除される
  • TypeScriptで実行時の型が宣言した型と一致しないと、混乱する。「不健全な型」という(p17)
  • C++のような言語の同じ名前でシグネチャが異なる関数が定義できる機能をオーバーロードという。TypeScriptではできない(p18)
  • 1つの関数には複数の型シグネチャを指定できるが、実装は1つでなければならない。関数のオーバーロード機能は完全に型レベルで存在する(p18)
    • どういったケースで使えるのだろう
  • 型は実行時に利用できない。実行時に型をチェックするには型を再構築するなんらかの方法が必要で、一般的にタグ付きユニオンやプロパティのチェックなどの方法がある(p19)
  • 関数を書くとき宣言したプロパティを持ち、それ以外のプロパティは持たない引数で呼び出すことを想定してしまいがちである。これは「閉じた型」「シールされた型」と呼ばれ、TypeScriptの型システムでは表現できない。TypeScriptの型は「オープン」である(p21)
  • Object.keys()が string[] で返ってくるのは「開いた型」であるから。オブジェクトのキーの一覧には、型宣言に明示的に列挙されていないフィールドが入っていることもありうるから、文字列で返る(p21)
  • JavaScriptがダックタイピングを奨励しているから、TypeScriptはこれをモデリングするため構造的型付けを用いる(p24)
  • エディタなどでTypeScriptがそれぞれの時点で変数の型をどのように捉えているかを見ることは、型の拡大と絞り込みに関する直感を養ううえで重要である。条件分岐のなかで変数の型が変化するのを確認することは型システムへの信頼を築くのにきわめて有効である(p30)
  • JavaScriptでは歴史的経緯から typeof nullobject" である(p32)
console.log(typeof null)
object
undefined
  • コードが実行される前にTypeScriptがエラーをチェックしているときには変数は型を持っているだけ。ありえる値の集合と考えられ、この集合は型のドメインと呼ぶ。number型はすべての数値の値の集合と考えられる。通常互換的に語られる「型」と「値の集合」は区別できる(p35)
    • never型は空集合。型階層の1番下に位置することから「ボトム型」と呼ばれることもある
    • 次に小さいのは単一の値を含む集合である。リテラル型が該当する
    • 2つまたは3つの値を持つ型はリテラル型のユニオンとして作れる
  • 型チェッカーが行っていることの多くは、ある集合が別の集合の部分集合であるかをテストすること(p36)
interface Identified {
  id: string;
}
  • ↑このインターフェースは、その型のドメインに含まれる値を説明している。どちらも満たすならそれはIdentified:
    • 値はオブジェクトか
    • stringに代入可能なidプロパティを持つか
  • 型を値の集合として考えると、型に対する演算を理解しやすくなる(p37)
  • 型演算は値の集合(型のドメイン)に適用されるのであって、インターフェースのプロパティに適用されるのではない(p37)
    • & のインターセクションは、プロパティではなく集合への交点である
  • extends は通常、interfaceにフィールドを追加するために使われるが、元の型の値の部分集合になっていればどんな使い方もできる(p38)
    • 元の型のフィールドは number | null なのを number に上書きするなど
  • 「サブタイプ」とは、ある型のドメインが他の型のドメインの部分集合であることを表現するための別の言い方である(p39)
  • TypeScriptは型の等価性をほとんどチェックしない。そのため型のテストを書くのが難しい(p42)
  • never (空の型)の対極にあるのは unknown である。この型のドメインにはJavaScriptのすべての値が含まれ、すべての型は unknown に代入可能である。型階層の最上位に位置するためトップ型と呼ばれる(p42)

関連

なし。