当我输入chrome开发工具时:
"1".padStart(2,0)
我知道
"01"
但是当我写
"1".padStart(2,0)
在我的打字稿项目中
我明白了
Property 'padStart' does not exist on type 'string'.
为什么打字稿会抱怨?我该如何解决?
答案 0 :(得分:16)
padStart
在ES2017
标准中定义。您需要告诉打字稿使用适当的类型(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
进行以下更改之一:
更改移植目标。这迫使您的使用者拥有ES2017(或更高版本)运行时,但您自己无需再付出任何努力。在这种情况下,请设置target: "es2017"
。
更改可用库的列表。在这种情况下,如果不确定客户端是否足够现代,则必须为他们使用的ES2017元素提供polyfill。在这种情况下,请将"es2017"
添加到lib
参数的数组中(如果为空,则为lib: ["es2017"]
)。
答案 2 :(得分:2)
要使TypeScript知道String.prototype.padStart(),您需要在es2017
的库列表中指定tsconfig.json
。如果执行此操作,那么TypeScript将假定可以使用所有ES2017功能,而这些功能可能并不是您想要的。
像Node.js这样的平台并不总是实现新ECMAScript语言规范的完整功能集,因此仅在您确信它们存在的地方添加语言功能才更安全。如果不确定目标平台支持哪些功能,可以在node.green或MDNs browser compatibility list之类的页面上查找它们。
padStart
函数是String原型的一部分,因此只需在es2017.string
中添加tsconfig.json
即可:
{
"compilerOptions": {
"lib": ["es6", "es2017.string"],
...
},
}