項目11 余剰プロパティチェックと型チェックを区別する
余剰プロパティチェック
型が宣言されている場所でオブジェクトリテラルを使用する時、未知のプロパティを禁止する (フレッシュネス)
型が宣言されている場所とは?
宣言された型を持つ変数への代入
関数の引数
戻り値の型が宣言されている関数の戻り値
code:ts
interface Room {numDoors: number; ceilingHeightFt: number;}
const r: Room = {numDoors: 1, ceilingHeightFt: 10, elephant: 'present'} // elephantで型エラー
interface Options {title: string; darkMode?: boolean;}
function createWindow(options: Options) { ... }
createWindow({title: 'Spider Solitaire', darkmode: true}) // darkmodeで型エラー
オブジェクトリテラルを変数に格納して、型宣言されている変数に代入するケースは上記に当てはまらない
code:ts
const obj = {numDoors: 1, ceilingHeightFt: 10, elephant: 'present'};
const r: Room = obj; // オブジェクトリテラルでないのでOK
型アサーションを使った場合も、余剰プロパティチェックは適応されない
code:ts
const o = {darkmode: true, title: 'MS Hearts'} as Options; // OK
余剰プロパティチェックは代入可能性チェック(型チェック)とは異なる
余剰プロパティチェックを無効にする
インデックスシグネチャを使ってTyepScirptに追加のプロパティが想定されていることを伝える
code:ts
interface Options {darkMode?: boolean; otherOptions: string: unknown;}
const o: Options = { darkmode: true }; // OK
Pros/Consは項目16 インデックスシグネチャよりも適切な代替手段を使う
弱い型に対する余剰プロパティチェック
弱い型
オプションプロパティしかもたないインターフェースを指す用語
TypeScriptは以下のような弱い型に対して、値の型と宣言された型が少なくとも1つ共通のプロパティを持つことを確認する
code:ts
interface LineChartOptions {logscale?: boolean; invertedYAxis?: boolean; areaChart?: boolean;}
function setOptions(options: LineChartOptions) { ... }
const opts = { logScale: true };
setOptions(opts); // logScaleというプロパティが存在しない型エラー
余剰プロパティチェックを用いた、より具体的な例は、項目61 Record型を使って値の同期を保つで
#TypeScript