-
-
Notifications
You must be signed in to change notification settings - Fork 94
/
types.spec.ts
87 lines (71 loc) · 1.9 KB
/
types.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import {
createState,
EmptyConfig,
PropsFactory,
Reducer,
select,
Store,
withProps,
} from '../index';
import { expectTypeOf } from 'expect-type';
interface Props {
id: number;
name: string;
}
interface FooProps {
foo: string;
}
function withFoo(): PropsFactory<FooProps, EmptyConfig> {
return {
props: {
foo: '',
},
config: undefined,
};
}
describe('Store types', () => {
it('should set the correct types', () => {
const { state, config } = createState(
withProps<Props>({ id: 1, name: 'foo' }),
withFoo(),
);
expectTypeOf(state).toEqualTypeOf<Props & FooProps>();
expectTypeOf(config).toEqualTypeOf<EmptyConfig>();
const store = new Store({ state, config, name: 'foo' });
expectTypeOf(store.getValue()).toEqualTypeOf<Props & FooProps>();
expectTypeOf(store.update)
.parameter(0)
.toEqualTypeOf<Reducer<Props & FooProps>>();
store.subscribe((state) => {
expectTypeOf(state).toEqualTypeOf<Props & FooProps>();
});
store
.combine({
id: store.pipe(select((state) => state.id)),
name: store.pipe(select((state) => state.name)),
})
.subscribe((v) => {
expectTypeOf(v).toEqualTypeOf<Props>();
});
try {
store.combine({
// @ts-expect-error - Should be an observable
foo: 1,
});
} catch {
//
}
});
it('should work with union types', () => {
type Circle = { kind: 'CIRCLE'; diameter: number };
type Square = { kind: 'SQUARE'; edge: number };
type Shape = Circle | Square;
const v1 = createState(
withProps<Shape>({ kind: 'CIRCLE', diameter: 2 }),
withProps<{ id: number }>({ id: 1 }),
);
expectTypeOf(v1.state).toEqualTypeOf<Shape & { id: number }>();
const v2 = createState(withProps<Shape>({ kind: 'CIRCLE', diameter: 2 }));
expectTypeOf(v2.state).toEqualTypeOf<Shape>();
});
});