TypeScriptは、プリミティブ型(string, number, boolean)とそのオブジェクトラッパー(String, Number, Boolean)を区別します。ラッパーは、コンストラクタを介して作成されたオブジェクトです:
const primitive: string = 'hello'; const wrapper: String = new String('hello');
primitive === wrapperの比較では、結果はfalseになります:console.log('hello' === new String('hello')); // false
stringではなくString)を使用するように心掛けましょう。プリミティブの値がある場合、TypeScriptのインターフェイスにラッパー型(
String,Number,Boolean)を使用することは可能ですか?
回答: ラッパーの使用は推奨されません。ほとんどの場合、値はプリミティブ型であり、インターフェイスをラッパー型から直接継承するとエラーが発生します。常にstring, number, booleanを使用する方が良いです。
事例
ユーザーのフルネームを保存するウェブアプリケーションで、ユーザーインターフェイスにString型が使用されました。これにより、比較エラーや、同一な型を要求する単体テストの失敗が発生しました(プリミティブとそのラッパーは同一性で異なります)。
事例
ライブラリの開発者が、Numberでジェネリック関数の型を指定し、ライブラリのクライアントがプリミティブな値を渡したために、プリミティブ型に対して期待通りに機能しなかったタイプガードメソッドに問題が発生しました。型変換のデバッグが難しいエラーが発生しました。
事例
分析サービスで、ユーザーのアクティビティフラグにBoolean型が使用され、データのフィルタリング時の比較結果が常にfalseとなりましたが、視覚的には値が一致していました。これにより、データの不正な処理とレポートの崩壊を引き起こしました。