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)
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);
小智 6
将其与较旧的 Typescript 版本一起使用的解决方法
await (Promise as any).allSettled(promises);
Run Code Online (Sandbox Code Playgroud)