Skip to content

Commit 6c895e7

Browse files
authored
Merge pull request #15 from abraham/switch
Use a switch for type narrowing
2 parents 6a241c4 + 4dd9d83 commit 6c895e7

File tree

2 files changed

+40
-23
lines changed

2 files changed

+40
-23
lines changed

src/index.test.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
import { Failure, fold, Initialized, Pending, Success } from './index';
1+
import { Failure, fold, Initialized, Kinds, Pending, Success } from './index';
2+
3+
test('Kinds', () => {
4+
expect(Kinds).toEqual({
5+
'Failure': 'Failure',
6+
'Initialized': 'Initialized',
7+
'Pending': 'Pending',
8+
'Success': 'Success'
9+
});
10+
});
211

312
test('Initialized', () => {
413
expect(new Initialized()).toBeInstanceOf(Initialized);

src/index.ts

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,36 @@
11
export type RemoteData<E, D> = Initialized | Pending | Failure<E> | Success<D>;
22

3+
export enum Kinds {
4+
Initialized = 'Initialized',
5+
Pending = 'Pending',
6+
Failure = 'Failure',
7+
Success = 'Success',
8+
}
9+
310
export class Initialized {
4-
private kind = 'Initialized';
11+
public kind: typeof Kinds.Initialized = Kinds.Initialized;
512
}
613

714
export class Pending {
8-
private kind = 'Pending';
15+
public kind: typeof Kinds.Pending = Kinds.Pending;
916
}
1017

11-
export class Success<D> {
12-
private kind = 'Success';
18+
export class Failure<E> {
19+
public kind: typeof Kinds.Failure = Kinds.Failure;
1320

14-
constructor(public data: D) {
15-
if (data === null || data === undefined) {
16-
fail('Parameter "data" is required');
21+
constructor(public error: E) {
22+
if (error === null || error === undefined) {
23+
fail('Parameter "error" is required');
1724
}
1825
}
1926
}
2027

21-
export class Failure<E> {
22-
private kind = 'Failure';
28+
export class Success<D> {
29+
public kind: typeof Kinds.Success = Kinds.Success;
2330

24-
constructor(public error: E) {
25-
if (error === null || error === undefined) {
26-
fail('Parameter "error" is required');
31+
constructor(public data: D) {
32+
if (data === null || data === undefined) {
33+
fail('Parameter "data" is required');
2734
}
2835
}
2936
}
@@ -35,16 +42,17 @@ export function fold<T, E, D>(
3542
success: (data: D) => T,
3643
): (state: RemoteData<E, D>) => T {
3744
return (state: RemoteData<E, D>) => {
38-
if (state instanceof Initialized) {
39-
return initialized();
40-
} else if (state instanceof Pending) {
41-
return pending();
42-
} else if (state instanceof Success) {
43-
return success(state.data);
44-
} else if (state instanceof Failure) {
45-
return failure(state.error);
46-
} else {
47-
return fail('Unknown RemoteData type used');
45+
switch (state.kind) {
46+
case Kinds.Initialized:
47+
return initialized();
48+
case Kinds.Pending:
49+
return pending();
50+
case Kinds.Failure:
51+
return failure(state.error);
52+
case Kinds.Success:
53+
return success(state.data);
54+
default:
55+
return fail('Unknown RemoteData type used');
4856
}
4957
}
5058
}

0 commit comments

Comments
 (0)