@@ -3,85 +3,86 @@ import { expectError, expectType } from 'tsd';
33import { propEq } from '../es' ;
44
55type 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