Skip to content

Commit 038fb00

Browse files
committed
tests
1 parent fdc0c68 commit 038fb00

File tree

1 file changed

+75
-74
lines changed

1 file changed

+75
-74
lines changed

test/propEq.test.ts

Lines changed: 75 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,85 +3,86 @@ import { expectError, expectType } from 'tsd';
33
import { propEq } from '../es';
44

55
type Obj = {
6-
union: 'foo' | 'bar';
7-
str: string;
8-
num: number;
9-
u: undefined;
10-
n: null;
6+
literals: 'A' | 'B';
7+
union: number | string;
8+
nullable: number | null;
9+
optional?: number;
1110
};
1211

13-
const str: string = '';
14-
// explanation
15-
16-
// `string` is too wide for `'foo' | 'bar` for assignment
17-
({} as Obj).union = str;
18-
// but for comparison is fine
19-
({} as Obj).union === str;
20-
// null and undefined are allowed as well
21-
({} as Obj).str === null;
22-
({} as Obj).str === undefined;
23-
24-
// this is why we use `WidenLiterals` in the type definition
25-
26-
// propEq(val, name, obj)
27-
expectType<boolean>(propEq('foo', 'union', {} as Obj));
28-
// any string works here, see the above explanation as to why
29-
expectType<boolean>(propEq('else', 'union', {} as Obj));
30-
// also null or undefined
31-
expectType<boolean>(propEq(null, 'union', {} as Obj));
32-
expectType<boolean>(propEq(undefined, 'union', {} as Obj));
33-
// completely different type fails
34-
expectError(propEq(2, 'union', {} as Obj));
35-
// other props work as expected
36-
expectType<boolean>(propEq(2, 'num', {} as Obj));
37-
expectError(propEq(2, 'u', {} as Obj));
38-
expectType<boolean>(propEq(2, 'num', {} as Obj));
39-
expectError(propEq(2, 'n', {} as Obj));
40-
expectType<boolean>(propEq(null, 'n', {} as Obj));
41-
expectError(propEq(2, 'n', {} as Obj));
42-
expectType<boolean>(propEq(undefined, 'u', {} as Obj));
12+
const obj = {} as Obj;
4313

4414
// propEq(val)(name)(obj)
45-
expectType<boolean>(propEq('foo')('union')({} as Obj));
46-
// any string works here, see the above explanation as to why
47-
expectType<boolean>(propEq('else')('union')({} as Obj));
48-
// completely different type fails
49-
expectError(propEq(2, 'union', {} as Obj));
50-
// other props work as expected
51-
expectType<boolean>(propEq(2, 'num', {} as Obj));
52-
expectError(propEq(2)('u')({} as Obj));
53-
expectType<boolean>(propEq(2)('num')({} as Obj));
54-
expectError(propEq(2)('n')({} as Obj));
55-
expectType<boolean>(propEq(null, 'n', {} as Obj));
56-
expectError(propEq(2)('n')({} as Obj));
57-
expectType<boolean>(propEq(undefined, 'u', {} as Obj));
15+
expectType<boolean>(propEq('A')('literals')(obj));
16+
// any string works here and will return boolean, we can live with that
17+
expectType<boolean>(propEq('C')('literals')(obj));
18+
// a different base type returns `never`
19+
expectType<never>(propEq(2)('literals')(obj));
20+
// unions work
21+
expectType<boolean>(propEq(2)('union')(obj));
22+
expectType<boolean>(propEq('2')('union')(obj));
23+
expectType<never>(propEq(true)('union')(obj));
24+
// nullable works
25+
expectType<boolean>(propEq(2)('nullable')(obj));
26+
expectType<boolean>(propEq(null)('nullable')(obj));
27+
// optionals work
28+
expectType<boolean>(propEq(2)('optional')(obj));
29+
expectType<boolean>(propEq(undefined)('optional')(obj));
30+
// unknownKey errors
31+
expectError(propEq('whatever')('unknownKey')(obj));
5832

5933
// propEq(val)(name, obj)
60-
expectType<boolean>(propEq('foo')('union', {} as Obj));
61-
// 'nope' is inferred as 'string' here.
62-
expectType<boolean>(propEq('nope')('union', {} as Obj));
63-
// completely different type fails
64-
expectError(propEq(2)('union', {} as Obj));
65-
// other props work as expected
66-
expectType<boolean>(propEq(2)('num', {} as Obj));
67-
expectError(propEq(2)('u', {} as Obj));
68-
expectType<boolean>(propEq(2)('num', {} as Obj));
69-
expectError(propEq(2)('n', {} as Obj));
70-
expectType<boolean>(propEq(null)('n', {} as Obj));
71-
expectError(propEq(2)('n', {} as Obj));
72-
expectType<boolean>(propEq(undefined, 'u', {} as Obj));
34+
expectType<boolean>(propEq('A')('literals', obj));
35+
// any string works here and will return boolean, we can live with that
36+
expectType<boolean>(propEq('C')('literals', obj));
37+
// a different base type returns `never`
38+
expectType<never>(propEq(2)('literals', obj));
39+
// unions work
40+
expectType<boolean>(propEq(2)('union', obj));
41+
expectType<boolean>(propEq('2')('union', obj));
42+
expectType<never>(propEq(true)('union', obj));
43+
// nullable works
44+
expectType<boolean>(propEq(2)('nullable', obj));
45+
expectType<boolean>(propEq(null)('nullable', obj));
46+
// optionals work
47+
expectType<boolean>(propEq(2)('optional', obj));
48+
expectType<boolean>(propEq(undefined)('optional', obj));
49+
// unknownKey errors
50+
expectError(propEq('whatever')('unknownKey', obj));
7351

7452
// propEq(val, name)(obj)
75-
expectType<boolean>(propEq('foo', 'union')({} as Obj));
76-
// any string works here, see the above explanation as to why
77-
expectType<boolean>(propEq('else', 'union')({} as Obj));
78-
// completely different type fails
79-
expectError(propEq(2, 'union')({} as Obj));
80-
// other props work as expected
81-
expectType<boolean>(propEq(2, 'num')({} as Obj));
82-
expectError(propEq(2, 'u')({} as Obj));
83-
expectType<boolean>(propEq(2, 'num')({} as Obj));
84-
expectError(propEq(2, 'n')({} as Obj));
85-
expectType<boolean>(propEq(null, 'n')({} as Obj));
86-
expectError(propEq(2, 'n')({} as Obj));
87-
expectType<boolean>(propEq(undefined, 'u')({} as Obj));
53+
expectType<boolean>(propEq('A', 'literals')(obj));
54+
// any string works here and will return boolean, we can live with that
55+
expectType<boolean>(propEq('C', 'literals')(obj));
56+
// a different base type returns `never`
57+
expectType<never>(propEq(2, 'literals')(obj));
58+
// unions work
59+
expectType<boolean>(propEq(2, 'union')(obj));
60+
expectType<boolean>(propEq('2', 'union')(obj));
61+
expectType<never>(propEq(true, 'union')(obj));
62+
// nullable works
63+
expectType<boolean>(propEq(2, 'nullable')(obj));
64+
expectType<boolean>(propEq(null, 'nullable')(obj));
65+
// optionals work
66+
expectType<boolean>(propEq(2, 'optional')(obj));
67+
expectType<boolean>(propEq(undefined, 'optional')(obj));
68+
// unknownKey errors
69+
expectError(propEq('whatever', 'unknownKey')(obj));
70+
71+
// propEq(val, name, obj)
72+
expectType<boolean>(propEq('A', 'literals', obj));
73+
// any string works here and will return boolean, we can live with that
74+
expectError(propEq('C', 'literals', obj));
75+
// a different base type returns `never`
76+
expectError(propEq(2, 'literals', obj));
77+
// unions work
78+
expectType<boolean>(propEq(2, 'union', obj));
79+
expectType<boolean>(propEq('2', 'union', obj));
80+
expectError(propEq(true, 'union', obj));
81+
// nullable works
82+
expectType<boolean>(propEq(2, 'nullable', obj));
83+
expectType<boolean>(propEq(null, 'nullable', obj));
84+
// optionals work
85+
expectType<boolean>(propEq(2, 'optional', obj));
86+
expectType<boolean>(propEq(undefined, 'optional', obj));
87+
// unknownKey errors
88+
expectError(propEq('whatever', 'unknownKey', obj));

0 commit comments

Comments
 (0)