LoginSignup
31
18

TypeScriptでStringとstringどっち使うの問題

Posted at

突然ですが問題です

文字列の変数を宣言するとき、型注釈にStringstringのどちらを使いますか?

let foo: String;
let bar: string;

あまり意識したことない方もいるのではないでしょうか?

答え

stringの方を使いましょう。
その理由について見ていきましょう。

プリミティブ型とラッパーオブジェクト

stringはプリミティブ型で、Stringはラッパーオブジェクトです。

プリミティブ型について

文字列、数値、論理値などの基本的な値の型のことです。
プリミティブ型はimmutableという特性を持ちます。つまり、変更することができません。
また、プリミティブ型はメソッドやプロパティを持ちません。

ラッパーオブジェクトについて

ラッパーオブジェクトは、プリミティブ型の値をラップしたオブジェクトのことです。
平たく言うと、プリミティブ型を便利に使えるようにしたものです。
便利に使えるようにしたものですので、ラッパーオブジェクトはlengthなどのプロパティやtoUpperCase()などのメソッドを持っています。

typeofで確認してみると

プリミティブ型とラッパーオブジェクトについて、typeof演算子で確認してみると以下のようになります。

const foo = new String("foo");
const bar = "bar";

console.log(typeof(foo)); // -> object 
console.log(typeof(bar)); // -> string

プリミティブ型でもlengthを使える?

プリミティブ型はプロパティなどを持たないという話がありましたが、実際、プリミティブ型でlengthを使うことができます。

const bar: string = "bar";
console.log(bar.length) // -> 3

MDNで文字列のlengthについてみてみると、
Screenshot from 2023-08-05 14-28-11.png

ラッパーオブジェクトであるStringのプロパティであることがわかります。

プリミティブ型のプロパティにアクセスするとき、暗黙的にラッパーオブジェクトに変換される仕様となっています。
したがって、プリミティブ型であっても、ラッパーオブジェクトと同じようにメソッドなどを使うことができます。

結論

Stringではなくstringを使いましょう。
ラッパーオブジェクトではなくプリミティブ型を使いましょう。

TypeScriptのドキュメントにも

The type names String, Number, and Boolean (starting with capital letters) are legal, but refer to some special built-in types that will very rarely appear in your code. Always use string, number, or boolean for types.

と書かれています。

ラッパーオブジェクトを使うと

  • typeof演算子を使うとobjectとなり、型がわからない(Stringのラッパーオブジェクトを使ってもstringであることがわからない)
  • 演算子が使えない
    • 例えばNumberを使ったときに、下記のようなエラーになります
      Screenshot from 2023-08-05 14-59-15.png

参考

31
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
18