Skip to content

Commit c67b5de

Browse files
committed
don't infer from multiple distributive conditional types for now
1 parent 3a10dd2 commit c67b5de

4 files changed

Lines changed: 358 additions & 1 deletion

File tree

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27163,7 +27163,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2716327163
function inferToConditionalType(source: Type, target: ConditionalType) {
2716427164
const info = target.root.isDistributive ? getInferenceInfoForType(getActualTypeVariable(target.checkType)) : undefined;
2716527165
const saveIndividualPriority = info?.individualPriority;
27166-
if (info) {
27166+
if (info && !hasInferenceCandidates(info)) {
2716727167
info.individualPriority = (info.individualPriority || InferencePriority.None) | InferencePriority.DistributiveConditional;
2716827168
}
2716927169
if (source.flags & TypeFlags.Conditional) {
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
//// [tests/cases/compiler/inferToDistributiveConditionalTypeAndOtherTargets1.ts] ////
2+
3+
=== inferToDistributiveConditionalTypeAndOtherTargets1.ts ===
4+
type NonUndefinedGuard<T> = T extends undefined ? never : T;
5+
>NonUndefinedGuard : Symbol(NonUndefinedGuard, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 0, 0))
6+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 0, 23))
7+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 0, 23))
8+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 0, 23))
9+
10+
declare const RefSymbol: unique symbol;
11+
>RefSymbol : Symbol(RefSymbol, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 2, 13))
12+
13+
interface Ref<T = any, S = T> {
14+
>Ref : Symbol(Ref, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 2, 39))
15+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 4, 14))
16+
>S : Symbol(S, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 4, 22))
17+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 4, 14))
18+
19+
get value(): T;
20+
>value : Symbol(Ref.value, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 4, 31), Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 5, 17))
21+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 4, 14))
22+
23+
set value(_: S);
24+
>value : Symbol(Ref.value, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 4, 31), Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 5, 17))
25+
>_ : Symbol(_, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 6, 12))
26+
>S : Symbol(S, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 4, 22))
27+
28+
[RefSymbol]: true;
29+
>[RefSymbol] : Symbol(Ref[RefSymbol], Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 6, 18))
30+
>RefSymbol : Symbol(RefSymbol, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 2, 13))
31+
}
32+
33+
type MaybeRef<T> = Ref<T> | T;
34+
>MaybeRef : Symbol(MaybeRef, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 8, 1))
35+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 10, 14))
36+
>Ref : Symbol(Ref, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 2, 39))
37+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 10, 14))
38+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 10, 14))
39+
40+
type MaybeRefDeep<T> = MaybeRef<
41+
>MaybeRefDeep : Symbol(MaybeRefDeep, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 10, 30))
42+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 12, 18))
43+
>MaybeRef : Symbol(MaybeRef, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 8, 1))
44+
45+
T extends Function
46+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 12, 18))
47+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
48+
49+
? T
50+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 12, 18))
51+
52+
: T extends object
53+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 12, 18))
54+
55+
? {
56+
[Property in keyof T]: MaybeRefDeep<T[Property]>;
57+
>Property : Symbol(Property, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 17, 9))
58+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 12, 18))
59+
>MaybeRefDeep : Symbol(MaybeRefDeep, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 10, 30))
60+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 12, 18))
61+
>Property : Symbol(Property, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 17, 9))
62+
}
63+
: T
64+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 12, 18))
65+
66+
>;
67+
68+
type QueryFunction<T = unknown> = () => T | Promise<T>;
69+
>QueryFunction : Symbol(QueryFunction, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 20, 2))
70+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 22, 19))
71+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 22, 19))
72+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --))
73+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 22, 19))
74+
75+
type InitialDataFunction<T> = () => T | undefined;
76+
>InitialDataFunction : Symbol(InitialDataFunction, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 22, 55))
77+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 24, 25))
78+
>T : Symbol(T, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 24, 25))
79+
80+
interface QueryOptions<TQueryFnData = unknown, TData = TQueryFnData> {
81+
>QueryOptions : Symbol(QueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 24, 50))
82+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 26, 23))
83+
>TData : Symbol(TData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 26, 46))
84+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 26, 23))
85+
86+
queryFn?: QueryFunction<TQueryFnData>;
87+
>queryFn : Symbol(QueryOptions.queryFn, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 26, 70))
88+
>QueryFunction : Symbol(QueryFunction, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 20, 2))
89+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 26, 23))
90+
91+
initialData?: TData | InitialDataFunction<TData>;
92+
>initialData : Symbol(QueryOptions.initialData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 27, 40))
93+
>TData : Symbol(TData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 26, 46))
94+
>InitialDataFunction : Symbol(InitialDataFunction, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 22, 55))
95+
>TData : Symbol(TData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 26, 46))
96+
}
97+
98+
type UseQueryOptions<TQueryFnData = unknown, TQueryData = TQueryFnData> = {
99+
>UseQueryOptions : Symbol(UseQueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 29, 1))
100+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 31, 21))
101+
>TQueryData : Symbol(TQueryData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 31, 44))
102+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 31, 21))
103+
104+
[Property in keyof QueryOptions<TQueryFnData, TQueryData>]: MaybeRefDeep<
105+
>Property : Symbol(Property, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 32, 3))
106+
>QueryOptions : Symbol(QueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 24, 50))
107+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 31, 21))
108+
>TQueryData : Symbol(TQueryData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 31, 44))
109+
>MaybeRefDeep : Symbol(MaybeRefDeep, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 10, 30))
110+
111+
QueryOptions<TQueryFnData, TQueryData>[Property]
112+
>QueryOptions : Symbol(QueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 24, 50))
113+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 31, 21))
114+
>TQueryData : Symbol(TQueryData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 31, 44))
115+
>Property : Symbol(Property, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 32, 3))
116+
117+
>;
118+
};
119+
120+
type DefinedInitialQueryOptions<TQueryFnData = unknown> = UseQueryOptions<
121+
>DefinedInitialQueryOptions : Symbol(DefinedInitialQueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 35, 2))
122+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 37, 32))
123+
>UseQueryOptions : Symbol(UseQueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 29, 1))
124+
125+
TQueryFnData,
126+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 37, 32))
127+
128+
TQueryFnData
129+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 37, 32))
130+
131+
> & {
132+
initialData:
133+
>initialData : Symbol(initialData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 40, 5))
134+
135+
| NonUndefinedGuard<TQueryFnData>
136+
>NonUndefinedGuard : Symbol(NonUndefinedGuard, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 0, 0))
137+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 37, 32))
138+
139+
| (() => NonUndefinedGuard<TQueryFnData>);
140+
>NonUndefinedGuard : Symbol(NonUndefinedGuard, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 0, 0))
141+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 37, 32))
142+
143+
};
144+
145+
declare function queryOptions<TQueryFnData = unknown>(
146+
>queryOptions : Symbol(queryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 44, 2))
147+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 46, 30))
148+
149+
options: DefinedInitialQueryOptions<TQueryFnData>,
150+
>options : Symbol(options, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 46, 54))
151+
>DefinedInitialQueryOptions : Symbol(DefinedInitialQueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 35, 2))
152+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 46, 30))
153+
154+
): DefinedInitialQueryOptions<TQueryFnData>;
155+
>DefinedInitialQueryOptions : Symbol(DefinedInitialQueryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 35, 2))
156+
>TQueryFnData : Symbol(TQueryFnData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 46, 30))
157+
158+
const result = queryOptions({
159+
>result : Symbol(result, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 50, 5))
160+
>queryOptions : Symbol(queryOptions, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 44, 2))
161+
162+
initialData: () => ({
163+
>initialData : Symbol(initialData, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 50, 29))
164+
165+
wow: true,
166+
>wow : Symbol(wow, Decl(inferToDistributiveConditionalTypeAndOtherTargets1.ts, 51, 23))
167+
168+
}),
169+
});
170+
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
//// [tests/cases/compiler/inferToDistributiveConditionalTypeAndOtherTargets1.ts] ////
2+
3+
=== inferToDistributiveConditionalTypeAndOtherTargets1.ts ===
4+
type NonUndefinedGuard<T> = T extends undefined ? never : T;
5+
>NonUndefinedGuard : NonUndefinedGuard<T>
6+
> : ^^^^^^^^^^^^^^^^^^^^
7+
8+
declare const RefSymbol: unique symbol;
9+
>RefSymbol : unique symbol
10+
> : ^^^^^^^^^^^^^
11+
12+
interface Ref<T = any, S = T> {
13+
get value(): T;
14+
>value : T
15+
> : ^
16+
17+
set value(_: S);
18+
>value : T
19+
> : ^
20+
>_ : S
21+
> : ^
22+
23+
[RefSymbol]: true;
24+
>[RefSymbol] : true
25+
> : ^^^^
26+
>RefSymbol : unique symbol
27+
> : ^^^^^^^^^^^^^
28+
>true : true
29+
> : ^^^^
30+
}
31+
32+
type MaybeRef<T> = Ref<T> | T;
33+
>MaybeRef : MaybeRef<T>
34+
> : ^^^^^^^^^^^
35+
36+
type MaybeRefDeep<T> = MaybeRef<
37+
>MaybeRefDeep : MaybeRefDeep<T>
38+
> : ^^^^^^^^^^^^^^^
39+
40+
T extends Function
41+
? T
42+
: T extends object
43+
? {
44+
[Property in keyof T]: MaybeRefDeep<T[Property]>;
45+
}
46+
: T
47+
>;
48+
49+
type QueryFunction<T = unknown> = () => T | Promise<T>;
50+
>QueryFunction : QueryFunction<T>
51+
> : ^^^^^^^^^^^^^^^^
52+
53+
type InitialDataFunction<T> = () => T | undefined;
54+
>InitialDataFunction : InitialDataFunction<T>
55+
> : ^^^^^^^^^^^^^^^^^^^^^^
56+
57+
interface QueryOptions<TQueryFnData = unknown, TData = TQueryFnData> {
58+
queryFn?: QueryFunction<TQueryFnData>;
59+
>queryFn : QueryFunction<TQueryFnData> | undefined
60+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
61+
62+
initialData?: TData | InitialDataFunction<TData>;
63+
>initialData : TData | InitialDataFunction<TData> | undefined
64+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
65+
}
66+
67+
type UseQueryOptions<TQueryFnData = unknown, TQueryData = TQueryFnData> = {
68+
>UseQueryOptions : UseQueryOptions<TQueryFnData, TQueryData>
69+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
70+
71+
[Property in keyof QueryOptions<TQueryFnData, TQueryData>]: MaybeRefDeep<
72+
QueryOptions<TQueryFnData, TQueryData>[Property]
73+
>;
74+
};
75+
76+
type DefinedInitialQueryOptions<TQueryFnData = unknown> = UseQueryOptions<
77+
>DefinedInitialQueryOptions : DefinedInitialQueryOptions<TQueryFnData>
78+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
79+
80+
TQueryFnData,
81+
TQueryFnData
82+
> & {
83+
initialData:
84+
>initialData : NonUndefinedGuard<TQueryFnData> | (() => NonUndefinedGuard<TQueryFnData>)
85+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^
86+
87+
| NonUndefinedGuard<TQueryFnData>
88+
| (() => NonUndefinedGuard<TQueryFnData>);
89+
};
90+
91+
declare function queryOptions<TQueryFnData = unknown>(
92+
>queryOptions : <TQueryFnData = unknown>(options: DefinedInitialQueryOptions<TQueryFnData>) => DefinedInitialQueryOptions<TQueryFnData>
93+
> : ^ ^^^^^^^^^^^^ ^^ ^^^^^
94+
95+
options: DefinedInitialQueryOptions<TQueryFnData>,
96+
>options : DefinedInitialQueryOptions<TQueryFnData>
97+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
98+
99+
): DefinedInitialQueryOptions<TQueryFnData>;
100+
101+
const result = queryOptions({
102+
>result : DefinedInitialQueryOptions<{ wow: boolean; }>
103+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
104+
>queryOptions({ initialData: () => ({ wow: true, }),}) : DefinedInitialQueryOptions<{ wow: boolean; }>
105+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
106+
>queryOptions : <TQueryFnData = unknown>(options: DefinedInitialQueryOptions<TQueryFnData>) => DefinedInitialQueryOptions<TQueryFnData>
107+
> : ^ ^^^^^^^^^^^^ ^^ ^^^^^
108+
>{ initialData: () => ({ wow: true, }),} : { initialData: () => { wow: boolean; }; }
109+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
110+
111+
initialData: () => ({
112+
>initialData : () => { wow: boolean; }
113+
> : ^^^^^^^^^^^^^^^^^^^^^^^
114+
>() => ({ wow: true, }) : () => { wow: boolean; }
115+
> : ^^^^^^^^^^^^^^^^^^^^^^^
116+
>({ wow: true, }) : { wow: true; }
117+
> : ^^^^^^^^^^^^^^
118+
>{ wow: true, } : { wow: true; }
119+
> : ^^^^^^^^^^^^^^
120+
121+
wow: true,
122+
>wow : true
123+
> : ^^^^
124+
>true : true
125+
> : ^^^^
126+
127+
}),
128+
});
129+
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
type NonUndefinedGuard<T> = T extends undefined ? never : T;
5+
6+
declare const RefSymbol: unique symbol;
7+
8+
interface Ref<T = any, S = T> {
9+
get value(): T;
10+
set value(_: S);
11+
[RefSymbol]: true;
12+
}
13+
14+
type MaybeRef<T> = Ref<T> | T;
15+
16+
type MaybeRefDeep<T> = MaybeRef<
17+
T extends Function
18+
? T
19+
: T extends object
20+
? {
21+
[Property in keyof T]: MaybeRefDeep<T[Property]>;
22+
}
23+
: T
24+
>;
25+
26+
type QueryFunction<T = unknown> = () => T | Promise<T>;
27+
28+
type InitialDataFunction<T> = () => T | undefined;
29+
30+
interface QueryOptions<TQueryFnData = unknown, TData = TQueryFnData> {
31+
queryFn?: QueryFunction<TQueryFnData>;
32+
initialData?: TData | InitialDataFunction<TData>;
33+
}
34+
35+
type UseQueryOptions<TQueryFnData = unknown, TQueryData = TQueryFnData> = {
36+
[Property in keyof QueryOptions<TQueryFnData, TQueryData>]: MaybeRefDeep<
37+
QueryOptions<TQueryFnData, TQueryData>[Property]
38+
>;
39+
};
40+
41+
type DefinedInitialQueryOptions<TQueryFnData = unknown> = UseQueryOptions<
42+
TQueryFnData,
43+
TQueryFnData
44+
> & {
45+
initialData:
46+
| NonUndefinedGuard<TQueryFnData>
47+
| (() => NonUndefinedGuard<TQueryFnData>);
48+
};
49+
50+
declare function queryOptions<TQueryFnData = unknown>(
51+
options: DefinedInitialQueryOptions<TQueryFnData>,
52+
): DefinedInitialQueryOptions<TQueryFnData>;
53+
54+
const result = queryOptions({
55+
initialData: () => ({
56+
wow: true,
57+
}),
58+
});

0 commit comments

Comments
 (0)