@@ -17,3 +17,82 @@ expectType<'a' | 'c'>(exampleConditionalKeysWithUndefined);
1717
1818declare const exampleConditionalKeysTargetingNever : ConditionalKeys < Example , never > ;
1919expectType < 'e' > ( exampleConditionalKeysTargetingNever ) ;
20+
21+ // Readonly modifiers
22+ expectType < 'a' | 'c' > ( { } as ConditionalKeys < { readonly a : string ; readonly b : number ; c : Uppercase < string > } , string > ) ;
23+ expectType < never > ( { } as ConditionalKeys < { readonly a ?: string ; readonly b : number } , string > ) ;
24+ expectType < 'a' > ( { } as ConditionalKeys < { readonly a ?: string ; readonly b ?: number } , string | undefined > ) ;
25+
26+ // Optional modifiers
27+ expectType < 'b' > ( { } as ConditionalKeys < { a ?: string ; b : string } , string > ) ;
28+ expectType < never > ( { } as ConditionalKeys < { a ?: string ; b ?: string } , string > ) ;
29+ expectType < never > ( { } as ConditionalKeys < { a ?: string ; b : string } , undefined > ) ;
30+ expectType < 'a' | 'b' > ( { } as ConditionalKeys < { a ?: string ; b : string } , string | undefined > ) ;
31+ expectType < 'a' | 'b' > ( { } as ConditionalKeys < { readonly a ?: string ; readonly b : string } , string | undefined > ) ;
32+
33+ // Union in property values
34+ expectType < never > ( { } as ConditionalKeys < { a : boolean | number } , boolean > ) ;
35+ expectType < 'a' | 'b' | 'c' > ( { } as ConditionalKeys < { a : boolean | number ; b : boolean ; c : number } , boolean | number > ) ;
36+ expectType < 'b' > ( { } as ConditionalKeys < { a ?: boolean | number ; readonly b : boolean | number } , boolean | number > ) ;
37+ expectType < 'a' | 'b' > (
38+ { } as ConditionalKeys < { a ?: boolean | number ; readonly b ?: boolean ; c : bigint | number } , boolean | number | undefined > ,
39+ ) ;
40+
41+ // `never` as condition
42+ expectType < never > ( { } as ConditionalKeys < { a : string ; b : number } , never > ) ;
43+ expectType < never > ( { } as ConditionalKeys < { readonly a ?: string ; readonly b ?: number } , never > ) ;
44+ expectType < 'a' | 'b' > ( { } as ConditionalKeys < { a : never ; b : never } , never > ) ;
45+ expectType < 'a' | 'b' > ( { } as ConditionalKeys < { a : never ; b : never } , any > ) ;
46+ expectType < never > ( { } as ConditionalKeys < { a ?: never ; b ?: never } , never > ) ;
47+ expectType < 'a' | 'b' > ( { } as ConditionalKeys < { a ?: never ; b ?: never } , undefined > ) ;
48+
49+ // Unions
50+ expectType < never > ( { } as ConditionalKeys < { a : string } | { b : number } , string | number > ) ;
51+ expectType < never > ( { } as ConditionalKeys < { a : string } | { b : number } , string > ) ;
52+ expectType < never > ( { } as ConditionalKeys < { a : string } | { b : number } , number > ) ;
53+ expectType < never > ( { } as ConditionalKeys < { a : string } | { a : number } , number > ) ;
54+ expectType < 'a' > ( { } as ConditionalKeys < { a : string } | { a : number } , string | number > ) ;
55+ expectType < 'a' | 'b' > (
56+ { } as ConditionalKeys < { a : string ; b : bigint } | { a : number ; b : string ; c : boolean } , string | number | bigint > ,
57+ ) ;
58+ expectType < 'a' > ( { } as ConditionalKeys < { a : string } | { a : Lowercase < string > ; b : Uppercase < string > } , string > ) ;
59+ expectType < never > ( { } as ConditionalKeys < { length : number } | [ number ] , number > ) ;
60+
61+ // `any`/`unknown` as condition
62+ expectType < 'a' | 'b' | 'c' | 'd' | 'e' > (
63+ { } as ConditionalKeys < { a ?: string ; b : string | number ; readonly c : boolean ; readonly d ?: bigint ; e : never } , any > ,
64+ ) ;
65+ expectType < 'a' | 'b' | 'c' | 'd' > (
66+ { } as ConditionalKeys < { a ?: string ; b : string | number ; readonly c : boolean ; readonly d ?: bigint ; e : never } , unknown > ,
67+ ) ;
68+
69+ // Index signatures
70+ expectType < string | number > ( { } as ConditionalKeys < { [ x : string ] : boolean } , boolean > ) ;
71+ expectType < string | number > ( { } as ConditionalKeys < { [ x : string ] : string ; a : string } , string > ) ;
72+ expectType < Uppercase < string > | 'a' > ( { } as ConditionalKeys < { [ x : Uppercase < string > ] : string ; a : string } , string > ) ;
73+ expectType < number | 'a' > ( { } as ConditionalKeys < { [ x : Uppercase < string > ] : string ; [ x : number ] : number ; a : number } , number > ) ;
74+
75+ // Arrays and tuples
76+ expectType < '0' | '2' > ( { } as ConditionalKeys < [ string , number , string ] , string > ) ;
77+ expectType < '0' | '1' > ( { } as ConditionalKeys < [ string , string , string | number ] , string > ) ;
78+ expectType < '0' | '1' | '2' > ( { } as ConditionalKeys < [ string , number , string ] , any > ) ;
79+ expectType < '0' > ( { } as ConditionalKeys < [ string , string ?, string ?] , string > ) ;
80+ expectType < '0' | '1' | '2' > ( { } as ConditionalKeys < [ string , string ?, string ?] , string | undefined > ) ;
81+ expectType < never > ( { } as ConditionalKeys < [ string , number , ...boolean [ ] ] , boolean > ) ;
82+ expectType < '0' > ( { } as ConditionalKeys < [ string , number ?, ...boolean [ ] ] , string | number | boolean > ) ;
83+ expectType < '1' > ( { } as ConditionalKeys < [ string ?, number ?, ...boolean [ ] ] , number | undefined > ) ;
84+ expectType < '0' | '1' | number > ( { } as ConditionalKeys < [ string , number , ...boolean [ ] ] , string | number | boolean > ) ;
85+ expectType < '0' > ( { } as ConditionalKeys < [ bigint , ...number [ ] , bigint ] , bigint > ) ;
86+ expectType < never > ( { } as ConditionalKeys < [ ...boolean [ ] , string , string ] , string > ) ;
87+ expectType < number > ( { } as ConditionalKeys < [ ...string [ ] , string , string ] , string > ) ;
88+ expectType < number > ( { } as ConditionalKeys < string [ ] , string > ) ;
89+ expectType < never > ( { } as ConditionalKeys < string [ ] , number > ) ;
90+
91+ // Primitives
92+ expectType < 'length' > ( { } as ConditionalKeys < string , number > ) ;
93+ expectType < 'valueOf' > ( { } as ConditionalKeys < number , ( ) => number > ) ;
94+
95+ // Boundary cases
96+ expectType < never > ( { } as ConditionalKeys < { } , boolean > ) ;
97+ expectType < PropertyKey > ( { } as ConditionalKeys < any , boolean > ) ;
98+ expectType < never > ( { } as ConditionalKeys < never , boolean > ) ;
0 commit comments