-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Extending Promise gives runtime error: undefined is not a promise #15202
Comments
The issue here is that ES6 classes (e.g. The fix here is to use Here is a proposal for that from @rbuckton: var __construct = (this && this.__construct) || (typeof Reflect !== "undefined" && Reflect.construct
? function (self, target, args) { return self !== null && Reflect.construct(target, args, self.constructor) || self; }
: function (self, target, args) { return self !== null && target.apply(self, args) || self; });
var PatchedPromise = (function (_super) {
__extends(PatchedPromise, _super);
function PatchedPromise(executor) {
var _this = this;
_this = __construct(this, _super, [executor]);
return _this;
}
return PatchedPromise;
}(Promise)); |
I have filed #15397 for this proposal. |
FWIW, another workaround that seems to work is wrapping the promise in a class that's a "thenable". Here's one for a Deferred promise: export default class Deferred<T> {
private res: (value?: T | PromiseLike<T>) => void
private rej: (reason?: any) => void
private readonly promise: Promise<T>
constructor() {
this.promise = new Promise((resolve, reject) => {
this.res = resolve
this.rej = reject
})
}
then(
onfulfilled?: (value: T) => T | PromiseLike<T>,
onrejected?: (reason: any) => PromiseLike<never>
): Promise<T> {
return this.promise.then(onfulfilled, onrejected)
}
catch(onRejected?: (reason: any) => PromiseLike<never>): Promise<T> {
return this.promise.catch(onRejected)
}
resolve(value?: T | PromiseLike<T>): void {
return this.res(value)
}
reject(reason?: any): void {
return this.rej(reason)
}
} Seems to work with |
closing in favor of #15397 |
I also asks this on Stackoverflow, but I think this is a bug:
I'm trying to cancel my
async
method call in Typescript.To do this, I have created a new
Promise
type, which inherits from Promise.My first version was without the
Object.setPrototypeOf(..)
, but I took it for hereTypeScript Version: 2.2.0, targeting ES5
Code
Expected behavior:
No runtime error, or compile error if not allowed.
And of course working promise if no error.
Actual behavior:
Got a run-time error
Error:
Link to playground
The text was updated successfully, but these errors were encountered: