提问人:Mmm Donuts 提问时间:1/31/2023 最后编辑:VLAZMmm Donuts 更新时间:1/31/2023 访问量:100
覆盖 Bluebird.Promise 的 Promise 实现
Overriding Promise implementation to Bluebird.Promise
问:
我有一个场景,对于代码库的某些远程执行,promise 将未定义。在本地,它正在运行 Node。远程地,它运行另一个没有 Promise 的运行时。Bluebird 工作正常,但如果未定义,我想覆盖所有文件的 Promise。
像这样:
import { Promise as BlueBirdPromise } from 'bluebird';
if (!Promise) {
Promise = BlueBirdPromise;
Promise.setScheduler((fn: any) => {
setTimeout(fn, 0);
});
}
上面的代码不起作用,因为 Promise 和 BlueBirdPromise 是不同的类型。我相信 Promise 是 TS 中的一个接口。
有没有一种干净的方法可以做到这一点?
例:
import { Promise as BlueBirdPromise } from 'bluebird';
BlueBirdPromise.setScheduler((fn: any) => {
setTimeout(fn, 0);
});
// eslint-disable-next-line
Promise = BlueBirdPromise;
错误:
polyfills.ts:13:1 - error TS2741: Property '[Symbol.species]' is missing in type 'typeof Bluebird' but required in type 'PromiseConstructor'.
答:
0赞
Mmm Donuts
1/31/2023
#1
我们可以通过覆盖绑定到全局对象的 Promise 定义来实现这一点。这是在执行任何主代码之前在文件中完成的。index.js
在本地,Visual Studio Code 将识别为其默认类型。但是,在执行时,此块将使用 提供的默认定义覆盖默认定义。Promise
Promise
Bluebird
这样,任何对 的使用都将超过 Node 的定义。或者,如果远程运行时不是节点,则在没有节点的情况下提供实现。Promise
Bluebird
import { Promise as BlueBirdPromise } from 'bluebird';
BlueBirdPromise.setScheduler((fn: any) => {
setTimeout(fn, 0);
});
global.Promise = <any>BlueBirdPromise;
评论
0赞
katniss
1/31/2023
注意:正在转换为任何。在较新的版本中,我们使用 : 。<any>BlueBirdPromise
BlueBirdPromise
as
BlueBirdPromise as any
0赞
jasie
1/31/2023
虽然这段代码可能会解决这个问题,但包括解释它如何以及为什么解决这个问题将真正有助于提高你的帖子的质量,并可能导致更多的赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释,并指出适用的限制和假设。
评论
Promise
!Promise
BlueBirdPromise
Promise
Property '[Symbol.species]' is missing in type 'typeof Bluebird' but required in type 'PromiseConstructor'