項目10 ラッパーオブジェクト型(String、Number、Boolean、Symbol、BigInt)を使用しない
JavaScriptのプリミティブ値
以下の7種類が存在する
string
number
boolean
null
undefined
symbol(ES2015で追加)
bigint(ES2020で追加)
プリミティブはイミュータブルである点と、メソッドを持たない点でオブジェクトと区別される
stringプリミティブはメソッドを持たないが、Stringオブジェクトはメソッドを持つ
ラッパーオブジェクト
以下の種類がある
String
Nunber
Boolean
Symbol
BigInt
ラッパーオブジェクトは、プリミティブ値にメソッドを生やしたり、静的メソッドを提供するために存在しているため、インスタンス化はしない
hr.icon
stringプリミティブからメソッドを呼び出せる仕組み
charAtのようなメソッドにアクセスすると、JavaScriptはStringオブジェクトにラップし、メソッドを呼び出してからそのオブジェクトを破棄するようにしている
code:js
'primitive'.charAt(3) // 'm'
ラッパーオブジェクトへの暗黙的変換によってプリミティブ値のプロパティ代入は維持させれない
code:js
x = "hello"
x.language = "English"
x.language // インスタンスが破棄されているためundefinedになる
TypeScriptはプリミティブとラッパーオブジェクトを別々の方にすることで、この区別をモデリングする
code:ts
function getStringLen(foo: String) {return foo.length;}
getStringLen("hello"); // OK
getStringLen(new String("hello")); // OK
プリミティブにラッパーオブジェクトは代入可能だが、その逆は代入不可
stringを期待するメソッドにStringオブジェクトは渡せない
code:ts
function isGreeting(phrase: String) {
return 'hello', 'good day'.includes(phrase); // エラーになる
}
上記の理由から、型にはラッパーオブジェクトを使わない方が良い
typescript-eslintで、no-wapper-object-typesルールを使うことで、ラッパーオブジェクト型の使用を禁止できる
#TypeScript