Typescript告诉我'string'类型不存在属性'padStart'。为什么?

时间:2018-09-12 10:27:33

标签: typescript

当我输入chrome开发工具时:

"1".padStart(2,0)

我知道

"01"

但是当我写

"1".padStart(2,0)

在我的打字稿项目中

我明白了

Property 'padStart' does not exist on type 'string'.

为什么打字稿会抱怨?我该如何解决?

3 个答案:

答案 0 :(得分:16)

padStartES2017标准中定义。您需要告诉打字稿使用适当的类型(ES2017的类型)。如果运行时支持ES2017所需的所有语言功能,则可以通过将目标设置为ES2017来完成此操作(在编写本文时可能并非如此)。

另一种选择是仅设置libs选项,以便根据ES2017获得运行时对象的类型,但仍编译为您要定位的任何语言版本。(请注意,运行时本身需要支持padStart,打字稿将不提供任何多边形填充

您可以使用tsconfig选项在lib中进行此操作:

"compilerOptions": {
    "target": "es2016",
    "lib": [
        "es2017",
        "dom"
        "scripthost"
    ],
    // ...

}

您可以在此answer

中了解有关lib vs target的更多信息

答案 1 :(得分:4)

TypeScript默认情况下假设您的转码后的代码将在最糟糕的环境中运行(目前,我希望是最糟糕的环境),即在仅支持ES5的浏览器中运行。 String.prototype.padStart is an experimental feature仅在ES2017中受支持,因此TypeScript无法确定在运行时它是否已准备就绪。

如果您知道不会出现这种“最糟糕的情况”(您没有针对旧的浏览器,或者使用的是polyfills),则可以对tsconfig.json进行以下更改之一:

  1. 更改移植目标。这迫使您的使用者拥有ES2017(或更高版本)运行时,但您自己无需再付出任何努力。在这种情况下,请设置target: "es2017"

  2. 更改可用库的列表。在这种情况下,如果不确定客户端是否足够现代,则必须为他们使用的ES2017元素提供polyfill。在这种情况下,请将"es2017"添加到lib参数的数组中(如果为空,则为lib: ["es2017"])。

答案 2 :(得分:2)

要使TypeScript知道String.prototype.padStart(),您需要在es2017的库列表中指定tsconfig.json。如果执行此操作,那么TypeScript将假定可以使用所有ES2017功能,而这些功能可能并不是您想要的。

像Node.js这样的平台并不总是实现新ECMAScript语言规范的完整功能集,因此仅在您确信它们存在的地方添加语言功能才更安全。如果不确定目标平台支持哪些功能,可以在node.greenMDNs browser compatibility list之类的页面上查找它们。

padStart函数是String原型的一部分,因此只需在es2017.string中添加tsconfig.json即可:

{
  "compilerOptions": {
    "lib": ["es6", "es2017.string"],
    ...
  },
}