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

Pau*_*515 198 typescript

有没有人知道TypeScript中String和string之间的区别?假设它们应该是相同的,我是否正确?

var a: String = "test";
var b: string = "another test";
a = b;
b = a; // this gives a compiler error!
Run Code Online (Sandbox Code Playgroud)

当前版本的编译器说:

Type 'String' is not assignable to type 'string'.
  'string' is a primitive, but 'String' is a wrapper object.
     Prefer using 'string' when possible.
Run Code Online (Sandbox Code Playgroud)

那是一个错误吗?

Fen*_*ton 198

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

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

String是JavaScript String类型,用于创建新字符串.没有人这样做,因为在JavaScript中文字被认为是更好的,所以s2在上面的例子中创建一个新的字符串而不使用new关键字并且没有显式使用该String对象.

string 是TypeScript字符串类型,可用于键入变量,参数和返回值.

补充说明...

目前(2月2013年)两种s1,并s2有有效的JavaScript.s3是有效的TypeScript.

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

var arr = []; // not var arr = new Array();
var obj = {}; // not var obj = new Object();
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果不使用值初始化变量,通常会添加注释。 (2认同)
  • 我添加了一个答案来澄清“foo”与 new String(“foo”) 不是 TypeScript 引入的新区别 - 我认为将一个称为 JS 类型而将另一个称为 TS 类型没有帮助。 (2认同)

Joe*_*yet 47

这两种类型在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是您的第一行通过编译类型检查的原因.


Wil*_*een 11

在 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
Run Code Online (Sandbox Code Playgroud)

你的错误:

类型 'String' 不可分配给类型 'string'。'string' 是一个原语,但 'String' 是一个包装对象。尽可能使用“字符串”。

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


Jav*_*les 9

对于快速读者:

永远不要使用类型 Number、String、Boolean、Symbol 或 Object 这些类型是指几乎从未在 JavaScript 代码中正确使用的非原始盒装对象。

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


xgq*_*rms 5

打字稿:Stringvsstring

“String”类型的参数不能分配给“string”类型的参数。

'string' 是一个原语,但 'String' 是一个包装对象。

尽可能使用“字符串”。

演示

字符串对象

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

Run Code Online (Sandbox Code Playgroud)

字符串原语

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

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Mas*_*iri 5

简单回答:

  • string=> 是一种类型。例如 console.log(typeof 'foo') // 字符串
  • String=> 是一个对象,具有一些创建和操作字符串的方法。