有人知道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.

那是虫子吗?


当前回答

在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'是a 但'String'是一个包装器对象。 尽可能使用'string'。

由TS编译器抛出,因为您试图将类型字符串分配给字符串对象类型(通过new关键字创建)。编译器告诉你,你应该只对字符串基本类型使用类型string,你不能用这个类型来描述字符串对象类型。

其他回答

下面是一个例子,它显示了两者的区别,这将有助于解释。

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

String是JavaScript的String类型,您可以使用它来创建新的字符串。没有人这样做,因为在JavaScript中文字被认为更好,所以上面例子中的s2创建了一个新的字符串,没有使用new关键字,也没有显式地使用string对象。

string是TypeScript的字符串类型,你可以用它来输入变量、参数和返回值。

额外的笔记……

目前(2013年2月)s1和s2都是有效的JavaScript。s3是有效的TypeScript。

字符串的使用。你可能永远不需要使用它,字符串字面量被普遍接受为初始化字符串的正确方式。在JavaScript中,使用对象字面值和数组字面值也被认为更好:

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

如果你真的很喜欢字符串,你可以在TypeScript中以以下两种方式之一使用它……

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

String ==>原始数据类型。 String ==>非原语。它是一个对象,可以访问String类的方法和属性

对于快速阅读者:

不要使用数字、字符串、布尔、符号或对象类型。这些类型指的是非原始的盒装对象,在JavaScript代码中几乎从来没有适当使用过。(强调我的)

来源: https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html

JavaScript有7种基本类型字符串,数字,布尔值,null, undefined, symbol和bigint,前五种从一开始就存在,符号原语是在ES2015中添加的,bigint正在最终确定的过程中。

原语与对象的区别在于它是不可变的并且没有方法。你可能会反对字符串有方法

 console.log('primitive'.charAt(3)) // output is "m"

虽然字符串原语没有方法,但JavaScript也定义了string对象类型。JavaScript可以在这些类型之间自由转换。当您在字符串原语上访问charAt等方法时,JavaScript将其包装在string对象中,调用该方法,然后丢弃该对象。

TypeScript通过为原语及其对象包装器提供不同的类型来模拟这种区别:

字符串和字符串 数目和数目 布尔和布尔 符号与符号 bigint和bigint

通常情况下,如果你使用String而不是String,事情会正常工作,除了在某些情况下,编译器会引发一个错误

如您所见,string可以赋值给string,但string不能赋值给string。

按照错误消息中的建议使用字符串。TypeScript附带的所有类型声明都使用它,几乎所有其他库的类型也是如此。

此错误消息表明您正在尝试将类型为String的值分配给类型为String的变量或参数。在TypeScript中,string是一个表示字符序列的基本类型,而string是一个包装器对象,它提供了处理字符串的额外方法。

错误消息建议尽可能使用字符串类型而不是string,因为字符串类型效率更高,相关开销更少。这是因为String是一个对象,而JavaScript(因此TypeScript)中的对象存储在堆上,创建时需要额外的内存分配。相比之下,字符串值直接存储在堆栈上,这使得它们更有效地使用。

要修复此错误,您需要确保使用的是string类型,而不是期望使用的string类型。只需在代码中用String替换String就可以做到这一点。例如,如果你有一个String类型的变量,你可以把它改成这样的String类型:

let myString: String = "hello, world!"; // Incorrect
let myString: string = "hello, world!"; // Correct

还值得注意的是,通常情况下,您应该尽可能使用string而不是string,因为它更有效,更容易使用。