項目37 オプションプロパティは限定的に使用する
オプションプロパティを使う際のコスト
オプションプロパティは型チェッカーのサポートを受けられなくなる
オプションプロパティを使用する前提のコードではバグを生む原因になる
code:ts
interface AppConfig {darkMode: boolean; unitSystem?: UnitSystem;}
function formatHike({miles, hours}: Hike, config: AppConfig) {
const { unitSystem } = config;
const distanceDisplay = formatValue({
value: miles, units: 'miles', unitSystem
});
const paceDisplay = formatValue({
value: miles / hours, units: 'mph' // unitSystemを渡し忘れた!
});
return ${distanceDisplay} at ${paceDisplay};
}
オプションプロパティのデフォルト値はundefindなので、別の値で埋めるコードが多くなる
code:ts
declare let config: AppConfig;
const unitSystem = config.unitSystem ?? 'imperial';
オプションプロパティはTypeScriptの不健全性の原因となる可能性がある
オプションプロパティがN個あれば、組み合わせは2^N通り存在することになるため、多用は厳禁
オプションプロパティを必須にする方法
オプションプロパティのオプション外す
オプションプロパティを必須にした型を作成する
code:ts
interface InputAppConfig {
darkMode: boolean;
unitSystem?: UnitSystem;
}
interface AppConfig extends InputAppConfig {
unitSystem: UnitSystem; // 必須
}
オプションプロパティを使うべきシーン
既存APIを型で表現したり、後方互換性を維持しながらAPIを進化させる必要がある場合
モデリング対象の性質上必要な場合
人のミドルネームなど