我使用的是打字稿版本 4.3.5 和節點版本 14.18.1。我正在編譯針對舊瀏覽器和新瀏覽器的代碼(target=es5在 tsconfig 中)。我在我的源代碼中同時使用 Promise.all 和 Promise.allSettled。
在較舊的瀏覽器上,特別是 iPhone 8 上的 Safari,IOS 版本 11,我收到 Promise.allSettled 的客戶端錯誤。
據我了解,在使用時target=es5,typescript 應該編譯以使代碼與舊設備兼容,因此 Promise.allSettled 應該可以作業。請幫助我理解這個問題!以下是我的 tsconfig.json
{
"compilerOptions": {
"sourceMap": true,
"target": "es5",
"module": "commonjs",
"esModuleInterop": true,
"outDir": "dist",
"jsx": "react",
"lib": [
"ES2020.Promise",
"dom",
"webworker"
],
"skipLibCheck": true
},
"include": [
"typings/node.d.ts",
"typings/modules.d.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"node_modules",
"**/*.scss.d.ts"
]
}
uj5u.com熱心網友回復:
正如問題為什么我需要一個帶有 Typescript 的 polyfill?,TypeScript 不會自動提供向后兼容的實作(“polyfills”)。因此,targettsconfig做的比你想象的要少:它只重寫箭頭函式和生成器之類的語法,而不是Promise 之類的庫。實際上,您首先可以決議 Promise.allSettled 的唯一原因是您已在 list 中明確列出"ES2020.Promise",lib這告訴 TypeScript 在您的環境中您可以假設您可以訪問 ES2020 Promises(特別是Promise.allSettled)。
從那些lib檔案中,強調我的:
lib您可能出于以下幾個原因想要更改這些 [條目]:
- 您的程式不在瀏覽器中運行,因此您不需要“dom”型別定義
- 您的運行時平臺提供了某些 JavaScript API 物件(可能通過 polyfill),但還不支持給定 ECMAScript 版本的完整語法
- 您有一些(但不是全部)更高級別的 ECMAScript 版本的 polyfill 或本機實作
就像問題Promise.allSettled in babel ES6 implementation 一樣,您有幾個選項可以自己提供 polyfill,但值得注意的一個是core-js中的es.promise.all-settled.js。你可以使用指向一個簡短的 polyfill-import-only JS 檔案的入口點將它們集成到你的 Webpack 構建中,盡管使用的建議已被棄用,取而代之的是.polyfillsbabel-polyfillcore-js/stable
您將需要import或require其中之一:
core-js/stable/promise/all-settledpromise.allsettledts-polyfill/lib/es2020-promise(core-js無論如何使用)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448485.html
標籤:打字稿 网页包 承诺 ecmascript-5 tsconfig
上一篇:Instagram嵌入:React的JSX不支持命名空間標簽
下一篇:模塊網路作業者解決方法
