2

文字列を文字列として考えると機能します。しかし、文字列を文字列として考えることは壊れています:

var str1:String = "asdf"; 
var str2:String = new String("asdf");
var str3:string = "asdf";
var str4:string = new String("asdf"); // Error 

それを試してみてください

また:

var interfaceBased:String = "123";
var keywordBased:string ="123";
interfaceBased=keywordBased;
keywordBased=interfaceBased; // Error  

それを試してみてください

これは既知のコンパイラのバグですか?

4

2 に答える 2

5

StringはJavascriptタイプでstringあり、はTypescriptタイプです。癖ほどバグではないと思います。String()主な理由は、文字列リテラルに対してコンストラクターを使用する理由がまったくないためです。

ここを参照してください:Typescript:文字列と文字列の違い

于 2013-03-13T04:58:27.363 に答える
3

これはJavaScriptの癖に由来します。プリミティブ文字列とオブジェクト文字列があります。原始的な文字列は、まあ、あなたの日常の文字列です:

typeof "Hi! I'm a string!"  // => "string"

ただし、を使用するときはいつでもnew、プリミティブではなくオブジェクトを作成します。

typeof new String("Hi! I'm a string!")  // => "object"

また、JavaScriptは、プロパティにアクセスするたびに、プリミティブ文字列からオブジェクト文字列を暗黙的に作成します。これは、オブジェクトのみがプロパティを持つことができるためです。

var s = "Hi! I'm a string!";
s.property = 6;  // s implicitly coerced to object string, property added
console.log(s.property);  // => undefined
// property was added to the object string, but then the object string was
// discarded as s still contained the primitive string. then s was coerced again
// and the property was missing as it was only added to an object whose reference
// was immediately dropped.

オブジェクト文字列は、その癖のためにほとんど必要ありません(たとえば、空のオブジェクト文字列は真実です)。したがって、を使用するのではなく、new Stringほとんどの場合、String代わりに必要になります。オブジェクト文字列をプリミティブ文字列に戻すことさえできStringません。new

typeof String(new String("Hi! I'm a string!"))  // => "string"

この問題がTypeScriptで表面化するかどうかはわかりませんが、プリミティブ/オブジェクトの区別、特に真実性の問題は、で非常に奇妙になりBooleanます。例えば:

var condition = new Boolean(false);
if(condition) {  // always true; objects are always truthy
    alert("The world is ending!");
}

要するに、それはオブジェクト/プリミティブの区別のためです。ほとんどの場合、オプションがある場合はプリミティブが必要です。

于 2013-03-13T05:05:27.913 に答える