forked from remeda/remeda
-
Notifications
You must be signed in to change notification settings - Fork 0
/
isObject.test.ts
70 lines (65 loc) · 1.75 KB
/
isObject.test.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
import { typesDataProvider } from '../test/types_data_provider';
import { isObject } from './isObject';
describe('isObject', () => {
test('isObject: should work as type guard', () => {
const data = typesDataProvider('object');
if (isObject(data)) {
expect(typeof data).toEqual('object');
assertType<
| {
a: string;
}
| Date
| Error
| Promise<number>
>(data);
}
});
test('isObject: should work as type guard', () => {
const data = { data: 5 } as ReadonlyArray<number> | { data: 5 };
if (isObject(data)) {
expect(typeof data).toEqual('object');
assertType<{
data: 5;
}>(data);
}
});
test('isObject: should work as type guard for more narrow types', () => {
const data = { data: 5 } as Array<number> | { data: number };
if (isObject(data)) {
expect(typeof data).toEqual('object');
assertType<{
data: number;
}>(data);
}
});
test('should work even if data type is unknown', () => {
const data: unknown = typesDataProvider('object');
if (isObject(data)) {
expect(typeof data).toEqual('object');
assertType<Record<string, unknown>>(data);
}
});
test('isObject: should work as type guard in filter', () => {
const data = [
typesDataProvider('promise'),
typesDataProvider('array'),
typesDataProvider('boolean'),
typesDataProvider('function'),
typesDataProvider('object'),
].filter(isObject);
expect(data.every(c => typeof c === 'object' && !Array.isArray(c))).toEqual(
true
);
assertType<
Array<
| {
a: string;
}
| Date
| Error
| Promise<number>
>
>(data);
});
});