Skip to content

Commit 9819dcd

Browse files
authored
feat: throw IllegalStateError upon illegal state (#3)
1 parent 1b60c0f commit 9819dcd

File tree

4 files changed

+26
-9
lines changed

4 files changed

+26
-9
lines changed

src/DeferredPromise.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import { IllegalStateError } from "./IllegalStateError";
2+
13
export type DeferredPromiseState = "pending" | "resolved" | "rejected";
4+
25
export type ResolveFunction<Data extends any, Result = void> = (
36
data: Data
47
) => Result | PromiseLike<Result>;
8+
59
export type RejectFunction<Result = void> = (
610
reason?: unknown
711
) => Result | PromiseLike<Result>;
@@ -31,8 +35,9 @@ export class DeferredPromise<Data extends any = void> {
3135
this.promise = new Promise<Data>((resolve, reject) => {
3236
this.resolve = (data) => {
3337
if (this.state !== "pending") {
34-
throw new TypeError(
35-
`Cannot resolve a DeferredPromise: illegal state ("${this.state}")`
38+
throw new IllegalStateError(
39+
"Cannot resolve a DeferredPromise: illegal state",
40+
this.state
3641
);
3742
}
3843

@@ -43,8 +48,9 @@ export class DeferredPromise<Data extends any = void> {
4348

4449
this.reject = (reason) => {
4550
if (this.state !== "pending") {
46-
throw new TypeError(
47-
`Cannot reject a DeferredPromise: illegal state ("${this.state}")`
51+
throw new IllegalStateError(
52+
"Cannot reject a DeferredPromise: illegal state",
53+
this.state
4854
);
4955
}
5056

src/IllegalStateError.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { type DeferredPromiseState } from "./DeferredPromise";
2+
3+
export class IllegalStateError extends Error {
4+
constructor(message: string, public readonly state: DeferredPromiseState) {
5+
super(message);
6+
}
7+
}

src/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
export * from './DeferredPromise'
1+
export * from "./DeferredPromise";
2+
export * from "./IllegalStateError";

test/DeferredPromise.test.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { DeferredPromise } from "../src";
2+
import { IllegalStateError } from "../src/IllegalStateError";
23

34
describe("Promise-compliance", () => {
45
it('can be listened to with ".then()"', (done) => {
@@ -105,8 +106,9 @@ describe("resolve()", () => {
105106
promise.resolve(123);
106107

107108
expect(() => promise.resolve(456)).toThrow(
108-
new TypeError(
109-
'Cannot resolve a DeferredPromise: illegal state ("resolved")'
109+
new IllegalStateError(
110+
"Cannot resolve a DeferredPromise: illegal state",
111+
"resolved"
110112
)
111113
);
112114
});
@@ -117,8 +119,9 @@ describe("resolve()", () => {
117119
promise.reject();
118120

119121
expect(() => promise.resolve(123)).toThrow(
120-
new TypeError(
121-
'Cannot resolve a DeferredPromise: illegal state ("rejected")'
122+
new IllegalStateError(
123+
"Cannot resolve a DeferredPromise: illegal state",
124+
"rejected"
122125
)
123126
);
124127
});

0 commit comments

Comments
 (0)