項目35 stringよりもそれに代わる、より精度の高い型を選択する
string型の変数を宣言する際は、もっと狭い型を指定できないか検討する
アルバムの型を例に考える
悪い型定義
string型が多用されていることと、コメントに型情報が記載されている
コメントに従っていないreleaseDate: 'August 17th, 1959'のような文字列でも許容されてしまう。
code:ts
interface Album {
artist: string;
title: string;
releaseDate: string; // YYYY-MM-DD
recordingType: string; // "live"または"studio"
}
良い型定義
プロパティに適した正確な型が与えられているため、意図しない値が入らない状態ができている
code:ts
type RecordingType = 'studio' | 'live';
interface Album {
artist: string;
title: string;
releaseDate: Date;
recordingType: RecordingType;
}
関数の引数にオブジェクトのプロパティ名が期待される場合は、stringではなくkeyof Tを使用する
code:ts
type K = keyof Album;
// ^? type K = keyof Album
// ("artist" | "title" | "releaseDate" | "recordingType"と同じ)
function pluck<T>(records: T[], key: keyof T) {
return records.map(r => rkey); }
stringにはanyと同じような問題が部分的に存在するため、不正な値を許容したり、型間の関係を隠してしまったりする
TypeScriptでは「http:」で始まるすべてのstringといったものもモデリングできる