diff --git a/src/DeferredPromise.ts b/src/DeferredPromise.ts index 213c888..ce788fa 100644 --- a/src/DeferredPromise.ts +++ b/src/DeferredPromise.ts @@ -1,7 +1,11 @@ +import { IllegalStateError } from "./IllegalStateError"; + export type DeferredPromiseState = "pending" | "resolved" | "rejected"; + export type ResolveFunction = ( data: Data ) => Result | PromiseLike; + export type RejectFunction = ( reason?: unknown ) => Result | PromiseLike; @@ -31,8 +35,9 @@ export class DeferredPromise { this.promise = new Promise((resolve, reject) => { this.resolve = (data) => { if (this.state !== "pending") { - throw new TypeError( - `Cannot resolve a DeferredPromise: illegal state ("${this.state}")` + throw new IllegalStateError( + "Cannot resolve a DeferredPromise: illegal state", + this.state ); } @@ -43,8 +48,9 @@ export class DeferredPromise { this.reject = (reason) => { if (this.state !== "pending") { - throw new TypeError( - `Cannot reject a DeferredPromise: illegal state ("${this.state}")` + throw new IllegalStateError( + "Cannot reject a DeferredPromise: illegal state", + this.state ); } diff --git a/src/IllegalStateError.ts b/src/IllegalStateError.ts new file mode 100644 index 0000000..20ed427 --- /dev/null +++ b/src/IllegalStateError.ts @@ -0,0 +1,7 @@ +import { type DeferredPromiseState } from "./DeferredPromise"; + +export class IllegalStateError extends Error { + constructor(message: string, public readonly state: DeferredPromiseState) { + super(message); + } +} diff --git a/src/index.ts b/src/index.ts index eef8c48..94c2cf7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ -export * from './DeferredPromise' +export * from "./DeferredPromise"; +export * from "./IllegalStateError"; diff --git a/test/DeferredPromise.test.ts b/test/DeferredPromise.test.ts index bf1246e..20f2d6c 100644 --- a/test/DeferredPromise.test.ts +++ b/test/DeferredPromise.test.ts @@ -1,4 +1,5 @@ import { DeferredPromise } from "../src"; +import { IllegalStateError } from "../src/IllegalStateError"; describe("Promise-compliance", () => { it('can be listened to with ".then()"', (done) => { @@ -105,8 +106,9 @@ describe("resolve()", () => { promise.resolve(123); expect(() => promise.resolve(456)).toThrow( - new TypeError( - 'Cannot resolve a DeferredPromise: illegal state ("resolved")' + new IllegalStateError( + "Cannot resolve a DeferredPromise: illegal state", + "resolved" ) ); }); @@ -117,8 +119,9 @@ describe("resolve()", () => { promise.reject(); expect(() => promise.resolve(123)).toThrow( - new TypeError( - 'Cannot resolve a DeferredPromise: illegal state ("rejected")' + new IllegalStateError( + "Cannot resolve a DeferredPromise: illegal state", + "rejected" ) ); });