打字稿:字符串和字符串之间的区别


255

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

那是个错误吗?


1
我认为“是虫子”确实是一个很好的哲学问题。可能是这样,但会造成混乱和编译错误。我认为这至少是一个问题。
盖尔曼

Answers:


251

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

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

感谢您清除此问题。因此,使用primitve类型的字符串是安全的,以避免在使用其他可用于字符串值的库时避免类型转换的问题(基于没有人实际使用String(?)的想法)。但是,是否应该平等对待string和String之间的分配,反之亦然?
Paul0515 2013年

1
实际上,使用这两种方法都是安全的,因为剥去了TypeScript类型,可以为您提供100%兼容的JavaScript(ES3或ES5版本以及版本1 ES6版本)。我建议使用string类型和文字初始化:var s: string = "My String";
Fenton

由于类型推断,记录var s: string = "My String"也与var s = "My String"... 相同...而且,无论我读过多少次此响应,我仍然没有掌握stringTypeScript中类型的目的,因为最终,('My String')['constructor'] === String...
mindplay.dk

2
如果不使用值初始化变量,通常会添加注释。
Fenton

2
我添加了一个答案来澄清“ foo”与新String(“ foo”)并不是TypeScript引入的新区别-我认为将一个JS类型称为另一个类型作为TS类型是没有帮助的。
乔·李·莫耶

60

这两种类型在JavaScript和TypeScript中都是不同的-TypeScript只是为我们提供了语法来注释和检查类型。

String引用String.prototype其原型链中具有的对象实例。您可以通过多种方式(例如new String('foo')和)获取此类实例Object('foo')。您可以String使用instanceof运算符来测试类型的实例,例如myString instanceof String

string是JavaScript的原始类型之一,而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

您的错误:

类型“字符串”不可分配给类型“字符串”。“字符串”是基元,但“字符串”是包装对象。尽可能使用“字符串”。

由TS编译器抛出,因为您尝试将类型分配给string字符串对象类型(通过new关键字创建)。编译器告诉您string仅应将类型用于字符串基本类型,并且不能使用此类型来描述字符串对象类型。


1

打字稿:Stringvsstring

“字符串”类型的参数不能分配给“字符串”类型的参数。

“字符串”是基元,但“字符串”是包装对象。

尽可能使用“字符串”。

演示

字符串对象

// 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));
  }
}

在此处输入图片说明


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.