'PromiseConstructor'.ts(2339) 类型上不存在属性 'allSettled'

sli*_*wp2 41 javascript typescript es6-promise

我正在尝试将Promise.allSettledAPI 与 TypeScript一起使用。代码在这里:

server.test.ts

it('should partial success if QPS > 50', async () => {
  const requests: any[] = [];
  for (let i = 0; i < 51; i++) {
    requests.push(rp('http://localhost:3000/place'));
  }
  await Promise.allSettled(requests);
  // ...
});
Run Code Online (Sandbox Code Playgroud)

但是 TSC 抛出一个错误:

'PromiseConstructor'.ts(2339) 类型上不存在属性 'allSettled'

我已经将这些值添加到lib选项中tsconfig.json

tsconfig.json

{
  "compilerOptions": {
    /* Basic Options */
    "target": "ES2015" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */,
    "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
    "lib": [
      "ES2015",
      "ES2016",
      "ES2017",
      "ES2018",
      "ES2019",
      "ES2020",
      "ESNext"
    ] 
   // ...
}
Run Code Online (Sandbox Code Playgroud)

打字稿版本: "typescript": "^3.7.3"

那么,我该如何解决这个问题?我知道我可以使用替代模块,但我对原生使用 TypeScript 感到好奇。

AKX*_*AKX 36

的类型Promise.allSettled()仅在 1 月份合并,显然将在 TypeScript 3.8 中发布。

作为临时解决方案,您可以自己为函数声明一个模拟类型:

declare interface PromiseConstructor {
    allSettled(promises: Array<Promise<any>>): Promise<Array<{status: 'fulfilled' | 'rejected', value?: any, reason?: any}>>;
}
Run Code Online (Sandbox Code Playgroud)

  • @oskar132 确保你的“tsconfig.json”在“lib”数组中有“es2020” (26认同)
  • 我的版本是 3.9.5,但仍然没有这种类型,我的环境有问题吗? (11认同)
  • 在“tsconfig.json”中更改为“es2020”后,我必须关闭并重新打开 VSCode,但它可以工作。谢谢@jmzagorski! (5认同)

Lei*_*son 20

为了让它在 Linux 上运行,我需要最新的打字稿版本:

npm install -g typescript@latest
Run Code Online (Sandbox Code Playgroud)

然后在您的 tsconfig 中,您当前需要 ES2020.Promise 库。我的完整 tsconfig:

{
  "compilerOptions": {
    "sourceMap": true,
    "module": "commonjs",
    "target": "es5",
    "jsx": "react",
    "esModuleInterop": true,
    "allowJs": true,
    "outDir": "./dist",
    "lib": [
      "ES2020.Promise",
    ]
  },
  "include": [
    "./src"
  ],
  "exclude": [
    "./node_modules",
    "./build"
  ],
  "compileOnSave": true,
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

用法: const results = await Promise.allSettled(BatchOfPromises);


Jos*_*ulf 10

它是 ES2020 并且处于第 4 阶段,因此如果没有 polyfill,就无法在任何地方使用。它被输入并合并到TS 中。尝试安装最新的 @types/node 包,看看是否能把它拉进来。

更新:看起来它会在es2020.promise着陆时添加到库中。

更新:npm i typescript@3.8.0-beta呜呜呜!


小智 6

将其与较旧的 Typescript 版本一起使用的解决方法

await (Promise as any).allSettled(promises);
Run Code Online (Sandbox Code Playgroud)

  • 如果不需要,请不要这样做。 (3认同)

小智 5

对我有用的是简单地将“es2020”添加到 tsconfig.json 文件的“lib”属性中

tsconfig.json 文件,“lib”属性中包含值“es2020”; “lib”属性用红色圈出