【问题标题】:What is the difference between types String and string?String 和 string 类型有什么区别?
【发布时间】:2021-12-21 10:29:19
【问题描述】:

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

这是一个错误吗?

【问题讨论】:

  • 我认为“这是一个错误”确实是一个很好的哲学问题。它可能是“有意的”,但它会造成混乱和编译错误。我认为这至少是个问题。
  • 简单的区别是这些 [String 和 string ] 的类型不同,因此一个不能分配给另一个。 typeof(String) 是 Object 这就是为什么我们可以使用 new String('...') 而 typeof(string) 不是 object。

标签: typescript


【解决方案1】:

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

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

【讨论】:

  • 感谢您清除它。因此,在使用其他处理字符串值的库时,使用原始类型字符串来避免可能的类型转换问题是安全的(基于没有人实际使用字符串(?)的想法)。字符串和字符串之间的分配不应该被平等对待吗?
  • 它实际上是安全的,因为 TypeScript 类型被剥离出来为您提供 100% 兼容的 JavaScript(ES3 或 ES5 风格,以及版本 1 ES6 风格)。我建议使用 string 类型和文字初始化:var s: string = "My String";
  • 记录在案,感谢类型推断,var s: string = "My String"var s = "My String" 相同......另外,无论我阅读多少次回复,我仍然没有抓住目的TypeScript 中的 string 类型,因为归根结底,('My String')['constructor'] === String...
  • 如果您没有使用值初始化变量,通常会添加注释。
  • 我添加了一个答案,以澄清 "foo" 与 new String("foo") 不是 TypeScript 引入的新区别 - 我认为将其称为 JS 没有帮助type 和另一个 TS 类型。
【解决方案2】:

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

String 指的是在其原型链中具有String.prototype 的对象实例。您可以通过各种方式获得这样的实例,例如new String('foo')Object('foo')。您可以使用 instanceof 运算符测试 String 类型的实例,例如myString instanceof String.

string 是 JavaScript 的基本类型之一,string 值主要是用文字创建的,例如'foo'"bar",并作为各种函数和运算符的结果类型。您可以使用typeof myString === 'string' 测试string 类型。

绝大多数时候,string 是您应该使用的类型 - 几乎所有接受或返回字符串的 API 接口都会使用它。将所有 JS 原始类型用作对象时,将使用它们对应的对象类型包装 (boxed),例如访问属性或调用方法。由于String 当前在TypeScript's core library 中被声明为接口而不是类,因此结构类型意味着string 被视为String 的子类型,这就是您的第一行通过编译类型检查的原因。

【讨论】:

    【解决方案3】:

    在 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 用于字符串原始类型,并且您不能使用此类型来描述字符串对象类型。

    【讨论】:

      【解决方案4】:

      TypeScript:Stringstring

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

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

      字符串原语

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

      【讨论】:

        【解决方案5】:

        对于快速阅读:

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

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

        【讨论】:

          【解决方案6】:

          简单回答:

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

          【讨论】:

            猜你喜欢
            • 2019-06-11
            • 1970-01-01
            • 1970-01-01
            • 2016-03-26
            • 2018-10-11
            • 2016-11-09
            • 1970-01-01
            相关资源
            最近更新 更多