TL;DR

  • 余剰プロパティチェックは、型が宣言されている場所にオブジェクトリテラルを代入するときに行われる。
  • 余剰プロパティチェックは、構造的型付けによる代入可能性のチェックとは別物であり、中間変数を挟むと働かない。

内容

余剰プロパティチェックとは

余剰プロパティチェックとは、値が指定された型にないプロパティを持っていないかを調べることである。「厳密なオブジェクトリテラルチェック」や「フレッシュネス」とも呼ばれる。

このチェックは、型が宣言されている場所にオブジェクトリテラルを代入するときに行われる。型が宣言されている場所とは、型を宣言した変数への代入や、引数の型が宣言された関数の呼び出しなどである。

interface Room {
  numDoors: number
  ceilingHeightFt: number
}
 
const r: Room = { numDoors: 1, ceilingHeightFt: 10, elephant: "present" } // 型エラー
interface Options {
  title: string;
  darkMode?: boolean;
}
function createWindow(options: Options) { ... }
 
createWindow({ title: "Spider Solitaire", darkmode: true }); // 型エラー

代入可能性のチェックとの違い

余剰プロパティチェックは、構造的型付けによる代入可能性のチェックとは異なる。余剰プロパティチェックは、型システムの基本である構造的な性質(項目4)を損なわずに、型の拡張性を制御しようとする仕組みである。

そのため、中間変数を挟むと余剰プロパティチェックは働かない。

const obj = { numDoors: 1, ceilingHeightFt: 10, elephant: "present" }
const r: Room = obj // OK

この 2 つを混同すると、TypeScript の代入可能性についてのメンタルモデルを作りにくくなる。

型アサーションを使った場合も、余剰プロパティチェックは行われない。これは、型アサーションより型アノテーションを使うべき理由の 1 つである(項目9)。

const o = { darkmode: true, title: "MS Hearts" } as Options // OK

弱い型

オプションのプロパティだけを持つ型を弱い型と呼ぶ。弱い型に代入するときは、代入可能性のチェックを通るために、少なくとも 1 つのプロパティが一致する必要がある。

interface LineChartOptions {
  logscale?: boolean;
  invertedYAxis?: boolean;
  areaChart?: boolean;
}
function setOptions(options: LineChartOptions) { ... }
 
const opts = { logScale: true };
setOptions(opts); // 型エラー
 
const opts2 = { logscale: true };
setOptions(opts2); // OK

キーワード