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

时间:2013-02-06 10:43:00

标签: typescript

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

这是一个错误吗?

6 个答案:

答案 0 :(得分:165)

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

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对象。 / p>

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

答案 1 :(得分:38)

两种类型在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原语类型将被包装(boxed)及其对应的对象类型,例如,访问属性或调用方法。由于String当前被声明为接口而不是TypeScript's core library中的类,因此结构类型意味着string被视为String的子类型,这就是您的第一行通过编译的原因类型检查。

答案 2 :(得分:3)

对于快速阅读者:

永远不要使用类型的数字,字符串,布尔值,符号或对象这些类型指的是非原始盒装对象几乎从未在JavaScript代码中正确使用过。

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

答案 3 :(得分:1)

TypeScript:unique_ptrString

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

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

尽可能使用“字符串”。

演示

字符串对象

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

enter image description here

答案 4 :(得分:0)

在JavaScript中,字符串可以是字符串基本类型或字符串对象。以下代码显示了区别:

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
     android:fillViewport="true">
<TableLayout
    android:id="@+id/tbl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:stretchColumns="*"
    android:layout_marginBottom="20dp" />
</HorizontalScrollView>

您的错误:

  

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

由TS编译器抛出,因为您试图将类型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关键字创建)。编译器告诉您只应将类型new用于字符串基本类型,而不能使用此类型来描述字符串对象类型。

答案 5 :(得分:0)

简单回答:

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