網站搜尋

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 做以下其中一項更改:

  1. 更改您的轉譯目標。這會強制您的使用者擁有 ES2017(或更新)執行環境,但不需要您自己付出更多努力。在這種情況下,設定 target: "es2017"。

  2. 更改可用的函式庫列表。在這種情況下,如果你不確定你的客戶端是否夠現代,你必須為你使用的 ES2017 元素提供 polyfills。在這種情況下,將 "es2017" 添加到 lib 參數的陣列中(如果它是空的,則會變成 lib: ["es2017"])。