402

TypeScriptのStringとの違いを知っている人はいますか? stringそれらが同じであるべきだと仮定するのは正しいですか?

var a: String = "test";
var b: string = "another test";
a = b;
b = a; // this gives a compiler error!

コンパイラの現在のバージョンは次のように述べています。

Type 'String' is not assignable to type 'string'.
  'string' is a primitive, but 'String' is a wrapper object.
     Prefer using 'string' when possible.

それはバグですか?

4

7 に答える 7

373

違いを示す例を次に示します。これは説明に役立ちます。

var s1 = new String("Avoid newing things where possible");
var s2 = "A string, in TypeScript of type 'string'";
var s3: string;

String新しい文字列を作成するために使用できるJavaScript の文字列型です。JavaScript ではリテラルの方が優れていると見なされるため、誰もこれを行いません。そのため、上記の例では、キーワードをs2使用せず、オブジェクトを明示的に使用せずに新しい文字列を作成します。newString

string変数、パラメータ、および戻り値を入力するために使用できる TypeScript 文字列型です。

その他の注意事項...

現在 (2013 年 2 月)s1との両方s2が有効な JavaScript です。s3有効な TypeScript です。

の使用String。おそらく使用する必要はありません。文字列リテラルは、文字列を初期化する正しい方法として広く受け入れられています。JavaScript では、オブジェクト リテラルと配列リテラルも使用することをお勧めします。

var arr = []; // not var arr = new Array();
var obj = {}; // not var obj = new Object();

文字列が本当に好きなら、TypeScript で 2 つの方法のいずれかで使用できます...

var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type
于 2013-02-06T11:04:06.760 に答える
76

この 2 つの型は、JavaScript と TypeScript で区別されます。TypeScript は、型に注釈を付けて型をチェックするための構文を提供するだけです。

StringString.prototypeプロトタイプ チェーンにあるオブジェクト インスタンスを参照します。このようなインスタンスは、 や など、さまざまな方法で取得できnew String('foo')ますObject('foo')。演算子Stringを使用して型のインスタンスをテストできます。instanceofmyString instanceof String

stringは JavaScript のプリミティブ型の 1 つであり、値は主にや などのstringリテラルで作成され、さまざまな関数や演算子の結果の型として作成されます。を使用してタイプをテストできます。'foo'"bar"stringtypeof myString === 'string'

ほとんどのstring場合、この型を使用する必要があります。文字列を取得または返すほぼすべての API インターフェイスで使用されます。すべての JS プリミティブ型は、プロパティへのアクセスやメソッドの呼び出しなど、オブジェクトとして使用するときに、対応するオブジェクト型でラップ (ボックス化) されます。は現在、 TypeScript のコア ライブラリのStringクラスではなくインターフェイスとして宣言されているため、構造型付けとは、がそのサブタイプと見なされることを意味し、これが最初の行がコンパイル タイプ チェックに合格する理由です。stringString

于 2016-01-25T13:19:16.903 に答える
11

JavaScript では、文字列は文字列プリミティブ型または文字列オブジェクトのいずれかになります。次のコードは、違いを示しています。

var a: string = 'test'; // string literal
var b: String = new String('another test'); // string wrapper object

console.log(typeof a); // string
console.log(typeof b); // object

あなたのエラー:

タイプ 'String' はタイプ 'string' に割り当てられません。「string」はプリミティブですが、「String」はラッパー オブジェクトです。可能であれば、'string' を使用することをお勧めします。

string型を文字列オブジェクト型 (newキーワードで作成)に割り当てようとしたため、TS コンパイラによってスローされます。コンパイラは、型stringを文字列プリミティブ型にのみ使用する必要があり、この型を使用して文字列オブジェクト型を記述できないことを通知しています。

于 2019-07-19T12:33:59.397 に答える
5

簡単な答え:

  • string=> は型です。例 console.log(typeof 'foo') // 文字列
  • String=> は、文字列を作成および操作するためのいくつかのメソッドを持つオブジェクトです。
于 2021-07-21T23:15:07.807 に答える