打字稿:String和string之间的区别

Typescript: difference between String and string

有人知道打字脚本中字符串和字符串的区别吗?我假设它们应该是相同的,对吗?

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

当前版本的编译器说:

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

那是虫子吗?


下面是一个显示差异的例子,这将有助于解释。

1
2
3
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创建了一个新字符串,而不使用new关键字,也不显式使用String对象。

String是typescript字符串类型,可用于键入变量、参数和返回值。

其他说明…

目前(2013年2月)s1s2都是有效的javascript。s3是有效的typescript。

使用String。您可能永远不需要使用它,字符串文本被普遍接受为初始化字符串的正确方法。在javascript中,也可以更好地使用对象文本和数组文本:

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

如果你真的很喜欢这个字符串,你可以用两种方法之一在typescript中使用它…

1
2
var str: String = new String("Hello world"); // Uses the JavaScript String object
var str: string = String("Hello World"); // Uses the TypeScript string type


这两种类型在javascript和typescript中都是不同的——typescript只是为我们提供了一种语法,以便在进行中对类型进行注释和检查。

String是指原型链中有String.prototype的对象实例。您可以通过各种方式获得这样的实例,例如new String('foo')Object('foo')。您可以使用instanceof操作符测试String类型的实例,例如myString instanceof String

String是javascript的原始类型之一,String的值主要是用文字(如'foo'"bar"创建的,并且是各种函数和运算符的结果类型。您可以使用typeof myString === 'string'测试String类型。

大多数情况下,String是您应该使用的类型——几乎所有接受或返回字符串的API接口都会使用它。当将所有JS基元类型用作对象(例如访问属性或调用方法)时,它们将被包装(装箱)为相应的对象类型。由于String当前声明为接口而不是typescript核心库中的类,因此结构类型意味着String被认为是String的子类型,这就是您的第一行通过编译类型检查的原因。