Typescript:文字列と文字列の違い


256

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

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.

それはバグですか?


1
「あれはバグか」というのは、本当に哲学的な質問だと思います。それはおそらくそうであるように意図されていますが、混乱とコンパイルエラーを作成します。少なくとも問題だと思います。
— ガーマン

回答:


252

これは、違いを示す例であり、説明に役立ちます。

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

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

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

それを片付けてくれてありがとう。そのため、(実際には文字列(?)を誰も使用していないという考えに基づいて)文字列値を処理する他のライブラリを使用する場合、特権型文字列を使用してタイプ変換の問題を回避するのが安全です。文字列と文字列の間の割り当てとその逆も同様に扱われるべきですか?
— Paul0515 2013

1
TypeScriptの型が取り除かれて100%互換性のあるJavaScript(ES3またはES5フレーバー、およびバージョン1 ES6フレーバー)が提供されるため、どちらを使用しても安全です。stringタイプとリテラルの初期化を使用することをお勧めしますvar s: string = "My String";。
— フェントン

レコードのため、型推論のおかげで、var s: string = "My String"と同じですvar s = "My String"...また、この応答を何度読んでもstring、TypeScriptで型の目的をまだ理解していません。、('My String')['constructor'] === String...
— mindplay.dk 2013年

2
変数を値で初期化していない場合は、通常、注釈を追加します。
— フェントン2013年

2
"foo"とnew String( "foo")はTypeScriptで導入された新しい区別ではないことを明確にするための回答を追加しました。一方をJSタイプ、もう一方をTSタイプと呼ぶのは役に立たないと思います。
— Joe Lee-Moyet

60

2つのタイプは、JavaScriptとTypeScriptで区別されます。TypeScriptは、タイプに注釈を付けてチェックする構文を提供します。

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

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

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


2

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


1

TypeScript:Stringvsstring

タイプ「ストリング」の引数は、タイプ「ストリング」のパラメーターに割り当てることができません。

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

可能な場合は 'string'を使用することをお勧めします。

デモ

文字列オブジェクト

// error
class SVGStorageUtils {
  store: object;
  constructor(store: object) {
    this.store = store;
  }
  setData(key: String = ``, data: object) {
    sessionStorage.setItem(key, JSON.stringify(data));
  }
  getData(key: String = ``) {
    const obj = JSON.parse(sessionStorage.getItem(key));
  }
}

文字列プリミティブ

// ok
class SVGStorageUtils {
  store: object;
  constructor(store: object) {
    this.store = store;
  }
  setData(key: string = ``, data: object) {
    sessionStorage.setItem(key, JSON.stringify(data));
  }
  getData(key: string = ``) {
    const obj = JSON.parse(sessionStorage.getItem(key));
  }
}

ここに画像の説明を入力してください


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.