Programmingバックエンド開発者 / TypeScriptアーキテクト

TypeScriptにおけるラッパー型(Wrapper types)はどのように実装され、どのように使用されるのでしょうか?プリミティブ型とそのラッパー型を使う際に発生する問題は何ですか?

Hintsage AIアシスタントで面接を突破

回答

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)を使用するように心掛けましょう。
  • ラッパーは、ジェネリックAPIライブラリを使用する必要がある場合(例えば、リフレクションやメタプログラミングのため)にのみ適用されます。

裏の質問

プリミティブの値がある場合、TypeScriptのインターフェイスにラッパー型(String, Number, Boolean)を使用することは可能ですか?

回答: ラッパーの使用は推奨されません。ほとんどの場合、値はプリミティブ型であり、インターフェイスをラッパー型から直接継承するとエラーが発生します。常にstring, number, booleanを使用する方が良いです。

このトピックについての知識不足による実際のエラーの例


事例

ユーザーのフルネームを保存するウェブアプリケーションで、ユーザーインターフェイスにString型が使用されました。これにより、比較エラーや、同一な型を要求する単体テストの失敗が発生しました(プリミティブとそのラッパーは同一性で異なります)。


事例

ライブラリの開発者が、Numberでジェネリック関数の型を指定し、ライブラリのクライアントがプリミティブな値を渡したために、プリミティブ型に対して期待通りに機能しなかったタイプガードメソッドに問題が発生しました。型変換のデバッグが難しいエラーが発生しました。


事例

分析サービスで、ユーザーのアクティビティフラグにBoolean型が使用され、データのフィルタリング時の比較結果が常にfalseとなりましたが、視覚的には値が一致していました。これにより、データの不正な処理とレポートの崩壊を引き起こしました。