String 和 string 类型有什么区别?

新手上路,请多包涵

有谁知道 TypeScript 中 Stringstring 之间的区别?我是否正确假设它们应该是相同的?

 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.

那是一个错误吗?

原文由 Paul0515 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

 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 中,使用对象字面量和数组字面量也被认为更好:

 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

原文由 Fenton 发布,翻译遵循 CC BY-SA 3.0 许可协议

JavaScript 有 7 种原始类型 strings, numbers, booleans, null, undefined, symbol, and bigint ,前 5 种从一开始就存在,符号原始类型是在 ES2015 中添加的,而 bigint 正在最终确定中。

基元与对象的区别在于不可变且没有方法。你可能会反对字符串确实有方法

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

好吧,虽然字符串原语没有方法,但 JavaScript 还定义了一个 String 对象类型。 JavaScript 在这些类型之间 自由转换。当您在字符串原语上访问 charAt 之类的方法时,JavaScript 会将其包装在 String 对象中,调用该方法,然后将该对象丢弃。

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

  • 字符串和字符串
  • 号码和号码
  • 布尔值和布尔值
  • 符号和符号
  • 大整数和大整数

如果您使用 String 而不是 string ,通常事情会起作用,除了在某些情况下,编译器会引发错误 在此处输入图像描述

如您所见, string 可分配给 String String 不可分配给 string

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

原文由 WadeeSami 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进