Typescript 告訴我屬性 'padStart' 在類型 'string' 上不存在。為什麼?
當我在 Chrome 開發者工具中輸入時:
"1".padStart(2,0)
我明白
"01"
但是當我寫的時候
"1".padStart(2,0)
在我的 TypeScript 專案中
我明白
Property 'padStart' does not exist on type 'string'.
為什麼 Typescript 會抱怨?我該如何解決這個問題?
答案#1
padStart 在 ES2017 標準中被定義。你需要告訴 TypeScript 使用相應的型別定義(即 ES2017 的型別定義)。你可以透過將目標設為 ES2017 來做到這一點,如果你的運行環境支援 ES2017 所需的所有語言特性(在撰寫本文時,這可能並非如此)。
另一個選項是僅設置 libs 選項,以便根據 ES2017 獲取運行時對象的類型定義,但仍然編譯到你所目標的語言版本。(請注意,運行時本身需要支持 padStart,TypeScript 不會提供任何 poly-fill)
你可以在 tsconfig 中使用 lib 選項來執行此操作:
"compilerOptions": {
"target": "es2016",
"lib": [
"es2017",
"dom"
"scripthost"
],
// ...
}
你可以在這個回答中閱讀更多關於 lib 與 target 的資訊
答案#2
要讓 TypeScript 知道 String.prototype.padStart(),你需要在你的 tsconfig.json 的庫列表中指定 es2017。如果你這麼做,那麼 TypeScript 將假設所有 ES2017 的特性都可以使用,這可能不完全是你想要的。
像 Node.js 這樣的平台並不總是實現新的 ECMAScript 語言規範的完整功能集,因此最好只在你確信其存在的地方添加語言功能。如果你不確定你的目標平台支持哪些功能,可以查看像 node.green 或 MDN 的瀏覽器兼容性列表這樣的頁面。
padStart 函數是 String 原型的一部分,所以只需在你的 tsconfig.json 中添加 es2017.string 就足夠了:
{
"compilerOptions": {
"lib": ["es6", "es2017.string"],
...
},
}
答案#3
TypeScript 預設認為你的轉譯程式碼將在最壞的環境中運行(目前,希望真的最壞),也就是只支援 ES5 的瀏覽器。String.prototype.padStart 是一個僅在 ES2017 支援的實驗性功能,因此 TypeScript 無法確定在執行時它是否存在且可用。
如果你知道這個「最壞情況」不會出現(你不是針對舊瀏覽器,或者使用了 polyfills),你可以對你的 tsconfig.json 做以下其中一項更改:
更改您的轉譯目標。這會強制您的使用者擁有 ES2017(或更新)執行環境,但不需要您自己付出更多努力。在這種情況下,設定
target: "es2017"。更改可用的函式庫列表。在這種情況下,如果你不確定你的客戶端是否夠現代,你必須為你使用的 ES2017 元素提供 polyfills。在這種情況下,將
"es2017"添加到lib參數的陣列中(如果它是空的,則會變成lib: ["es2017"])。
