Skip to content

Commit 84a09c7

Browse files
authored
Accurate constraintType for indexedAccessType (#53059)
1 parent 3d2c344 commit 84a09c7

6 files changed

+387
-0
lines changed

src/compiler/checker.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21583,6 +21583,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2158321583
else if (result = isRelatedTo(getTypeWithThisArgument(constraint, source), target, RecursionFlags.Source, reportErrors && constraint !== unknownType && !(targetFlags & sourceFlags & TypeFlags.TypeParameter), /*headMessage*/ undefined, intersectionState)) {
2158421584
return result;
2158521585
}
21586+
if (sourceFlags & TypeFlags.IndexedAccess) {
21587+
const indexType = (source as IndexedAccessType).indexType;
21588+
if (indexType.flags & TypeFlags.Index) {
21589+
const unresolvedIndexConstraint = getBaseConstraintOfType((indexType as IndexType).type);
21590+
const indexConstraint = unresolvedIndexConstraint && unresolvedIndexConstraint !== noConstraintType ? getIndexType(unresolvedIndexConstraint) : keyofConstraintType;
21591+
const constraint = getIndexedAccessType((source as IndexedAccessType).objectType, indexConstraint);
21592+
if (result = isRelatedTo(constraint, target, RecursionFlags.Source, /*reportErrors*/ false, /*headMessage*/ undefined, intersectionState)) {
21593+
return result;
21594+
}
21595+
}
21596+
}
2158621597
if (isMappedTypeGenericIndexedAccess(source)) {
2158721598
// For an indexed access type { [P in K]: E}[X], above we have already explored an instantiation of E with X
2158821599
// substituted for P. We also want to explore type { [P in K]: E }[C], where C is the constraint of X.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
tests/cases/compiler/constraintWithIndexedAccess.ts(28,102): error TS2344: Type 'DataFetchFns[T][T]' does not satisfy the constraint '(...args: any) => any'.
2+
Type 'DataFetchFns[T]["Boat"] | DataFetchFns[T]["Plane"]' is not assignable to type '(...args: any) => any'.
3+
Type 'DataFetchFns[T]["Boat"]' is not assignable to type '(...args: any) => any'.
4+
tests/cases/compiler/constraintWithIndexedAccess.ts(28,102): error TS2536: Type 'T' cannot be used to index type 'DataFetchFns[T]'.
5+
tests/cases/compiler/constraintWithIndexedAccess.ts(29,102): error TS2536: Type 'F' cannot be used to index type 'DataFetchFns'.
6+
tests/cases/compiler/constraintWithIndexedAccess.ts(29,102): error TS2344: Type 'DataFetchFns[F][F]' does not satisfy the constraint '(...args: any) => any'.
7+
Type 'DataFetchFns[F][keyof DataFetchFns[T]]' is not assignable to type '(...args: any) => any'.
8+
Type 'DataFetchFns[F][string] | DataFetchFns[F][number] | DataFetchFns[F][symbol]' is not assignable to type '(...args: any) => any'.
9+
Type 'DataFetchFns[F][string]' is not assignable to type '(...args: any) => any'.
10+
Type 'DataFetchFns[keyof DataFetchFns[T]][string]' is not assignable to type '(...args: any) => any'.
11+
tests/cases/compiler/constraintWithIndexedAccess.ts(29,102): error TS2536: Type 'F' cannot be used to index type 'DataFetchFns[F]'.
12+
13+
14+
==== tests/cases/compiler/constraintWithIndexedAccess.ts (5 errors) ====
15+
// #52399
16+
type DataFetchFns = {
17+
Boat: {
18+
requiresLicense: (id: string) => boolean;
19+
maxGroundSpeed: (id: string) => number;
20+
description: (id: string) => string;
21+
displacement: (id: string) => number;
22+
name: (id: string) => string;
23+
};
24+
Plane: {
25+
requiresLicense: (id: string) => boolean;
26+
maxGroundSpeed: (id: string) => number;
27+
maxTakeoffWeight: (id: string) => number;
28+
maxCruisingAltitude: (id: string) => number;
29+
name: (id: string) => string;
30+
}
31+
}
32+
export type NoTypeParamBoatRequired<F extends keyof DataFetchFns['Boat']> = ReturnType<DataFetchFns['Boat'][F]>;
33+
type TypeHardcodedAsParameterWithoutReturnType<T extends 'Boat', F extends keyof DataFetchFns[T]> = DataFetchFns[T][F];
34+
export type allAreFunctionsAsExpected = TypeHardcodedAsParameterWithoutReturnType<'Boat', keyof DataFetchFns['Boat']>;
35+
export type returnTypeOfFunctions = ReturnType<allAreFunctionsAsExpected>; //string | number | boolean as expected
36+
export type SucceedingCombo = ReturnType<TypeHardcodedAsParameterWithoutReturnType<'Boat', keyof DataFetchFns['Boat']>>;
37+
export type FailingCombo<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<TypeHardcodedAsParameterWithoutReturnType<T,F>>;
38+
export type TypeHardcodedAsParameter<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][F]>;
39+
type VehicleSelector<T extends keyof DataFetchFns> = DataFetchFns[T];
40+
export type TypeHardcodedAsParameter2<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<VehicleSelector<T>[F]>;
41+
export type TypeGeneric1<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][F]>;
42+
export type TypeGeneric2<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][T]>; // error
43+
~~~~~~~~~~~~~~~~~~
44+
!!! error TS2344: Type 'DataFetchFns[T][T]' does not satisfy the constraint '(...args: any) => any'.
45+
!!! error TS2344: Type 'DataFetchFns[T]["Boat"] | DataFetchFns[T]["Plane"]' is not assignable to type '(...args: any) => any'.
46+
!!! error TS2344: Type 'DataFetchFns[T]["Boat"]' is not assignable to type '(...args: any) => any'.
47+
~~~~~~~~~~~~~~~~~~
48+
!!! error TS2536: Type 'T' cannot be used to index type 'DataFetchFns[T]'.
49+
export type TypeGeneric3<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[F][F]>; // error
50+
~~~~~~~~~~~~~~~
51+
!!! error TS2536: Type 'F' cannot be used to index type 'DataFetchFns'.
52+
~~~~~~~~~~~~~~~~~~
53+
!!! error TS2344: Type 'DataFetchFns[F][F]' does not satisfy the constraint '(...args: any) => any'.
54+
!!! error TS2344: Type 'DataFetchFns[F][keyof DataFetchFns[T]]' is not assignable to type '(...args: any) => any'.
55+
!!! error TS2344: Type 'DataFetchFns[F][string] | DataFetchFns[F][number] | DataFetchFns[F][symbol]' is not assignable to type '(...args: any) => any'.
56+
!!! error TS2344: Type 'DataFetchFns[F][string]' is not assignable to type '(...args: any) => any'.
57+
!!! error TS2344: Type 'DataFetchFns[keyof DataFetchFns[T]][string]' is not assignable to type '(...args: any) => any'.
58+
~~~~~~~~~~~~~~~~~~
59+
!!! error TS2536: Type 'F' cannot be used to index type 'DataFetchFns[F]'.
60+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//// [constraintWithIndexedAccess.ts]
2+
// #52399
3+
type DataFetchFns = {
4+
Boat: {
5+
requiresLicense: (id: string) => boolean;
6+
maxGroundSpeed: (id: string) => number;
7+
description: (id: string) => string;
8+
displacement: (id: string) => number;
9+
name: (id: string) => string;
10+
};
11+
Plane: {
12+
requiresLicense: (id: string) => boolean;
13+
maxGroundSpeed: (id: string) => number;
14+
maxTakeoffWeight: (id: string) => number;
15+
maxCruisingAltitude: (id: string) => number;
16+
name: (id: string) => string;
17+
}
18+
}
19+
export type NoTypeParamBoatRequired<F extends keyof DataFetchFns['Boat']> = ReturnType<DataFetchFns['Boat'][F]>;
20+
type TypeHardcodedAsParameterWithoutReturnType<T extends 'Boat', F extends keyof DataFetchFns[T]> = DataFetchFns[T][F];
21+
export type allAreFunctionsAsExpected = TypeHardcodedAsParameterWithoutReturnType<'Boat', keyof DataFetchFns['Boat']>;
22+
export type returnTypeOfFunctions = ReturnType<allAreFunctionsAsExpected>; //string | number | boolean as expected
23+
export type SucceedingCombo = ReturnType<TypeHardcodedAsParameterWithoutReturnType<'Boat', keyof DataFetchFns['Boat']>>;
24+
export type FailingCombo<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<TypeHardcodedAsParameterWithoutReturnType<T,F>>;
25+
export type TypeHardcodedAsParameter<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][F]>;
26+
type VehicleSelector<T extends keyof DataFetchFns> = DataFetchFns[T];
27+
export type TypeHardcodedAsParameter2<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<VehicleSelector<T>[F]>;
28+
export type TypeGeneric1<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][F]>;
29+
export type TypeGeneric2<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][T]>; // error
30+
export type TypeGeneric3<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[F][F]>; // error
31+
32+
33+
//// [constraintWithIndexedAccess.js]
34+
"use strict";
35+
Object.defineProperty(exports, "__esModule", { value: true });
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
=== tests/cases/compiler/constraintWithIndexedAccess.ts ===
2+
// #52399
3+
type DataFetchFns = {
4+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
5+
6+
Boat: {
7+
>Boat : Symbol(Boat, Decl(constraintWithIndexedAccess.ts, 1, 21))
8+
9+
requiresLicense: (id: string) => boolean;
10+
>requiresLicense : Symbol(requiresLicense, Decl(constraintWithIndexedAccess.ts, 2, 11))
11+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 3, 26))
12+
13+
maxGroundSpeed: (id: string) => number;
14+
>maxGroundSpeed : Symbol(maxGroundSpeed, Decl(constraintWithIndexedAccess.ts, 3, 49))
15+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 4, 25))
16+
17+
description: (id: string) => string;
18+
>description : Symbol(description, Decl(constraintWithIndexedAccess.ts, 4, 47))
19+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 5, 22))
20+
21+
displacement: (id: string) => number;
22+
>displacement : Symbol(displacement, Decl(constraintWithIndexedAccess.ts, 5, 44))
23+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 6, 23))
24+
25+
name: (id: string) => string;
26+
>name : Symbol(name, Decl(constraintWithIndexedAccess.ts, 6, 45))
27+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 7, 15))
28+
29+
};
30+
Plane: {
31+
>Plane : Symbol(Plane, Decl(constraintWithIndexedAccess.ts, 8, 6))
32+
33+
requiresLicense: (id: string) => boolean;
34+
>requiresLicense : Symbol(requiresLicense, Decl(constraintWithIndexedAccess.ts, 9, 12))
35+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 10, 26))
36+
37+
maxGroundSpeed: (id: string) => number;
38+
>maxGroundSpeed : Symbol(maxGroundSpeed, Decl(constraintWithIndexedAccess.ts, 10, 49))
39+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 11, 25))
40+
41+
maxTakeoffWeight: (id: string) => number;
42+
>maxTakeoffWeight : Symbol(maxTakeoffWeight, Decl(constraintWithIndexedAccess.ts, 11, 47))
43+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 12, 27))
44+
45+
maxCruisingAltitude: (id: string) => number;
46+
>maxCruisingAltitude : Symbol(maxCruisingAltitude, Decl(constraintWithIndexedAccess.ts, 12, 49))
47+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 13, 30))
48+
49+
name: (id: string) => string;
50+
>name : Symbol(name, Decl(constraintWithIndexedAccess.ts, 13, 52))
51+
>id : Symbol(id, Decl(constraintWithIndexedAccess.ts, 14, 15))
52+
}
53+
}
54+
export type NoTypeParamBoatRequired<F extends keyof DataFetchFns['Boat']> = ReturnType<DataFetchFns['Boat'][F]>;
55+
>NoTypeParamBoatRequired : Symbol(NoTypeParamBoatRequired, Decl(constraintWithIndexedAccess.ts, 16, 1))
56+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 17, 36))
57+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
58+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
59+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
60+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 17, 36))
61+
62+
type TypeHardcodedAsParameterWithoutReturnType<T extends 'Boat', F extends keyof DataFetchFns[T]> = DataFetchFns[T][F];
63+
>TypeHardcodedAsParameterWithoutReturnType : Symbol(TypeHardcodedAsParameterWithoutReturnType, Decl(constraintWithIndexedAccess.ts, 17, 112))
64+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 18, 47))
65+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 18, 64))
66+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
67+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 18, 47))
68+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
69+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 18, 47))
70+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 18, 64))
71+
72+
export type allAreFunctionsAsExpected = TypeHardcodedAsParameterWithoutReturnType<'Boat', keyof DataFetchFns['Boat']>;
73+
>allAreFunctionsAsExpected : Symbol(allAreFunctionsAsExpected, Decl(constraintWithIndexedAccess.ts, 18, 119))
74+
>TypeHardcodedAsParameterWithoutReturnType : Symbol(TypeHardcodedAsParameterWithoutReturnType, Decl(constraintWithIndexedAccess.ts, 17, 112))
75+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
76+
77+
export type returnTypeOfFunctions = ReturnType<allAreFunctionsAsExpected>; //string | number | boolean as expected
78+
>returnTypeOfFunctions : Symbol(returnTypeOfFunctions, Decl(constraintWithIndexedAccess.ts, 19, 118))
79+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
80+
>allAreFunctionsAsExpected : Symbol(allAreFunctionsAsExpected, Decl(constraintWithIndexedAccess.ts, 18, 119))
81+
82+
export type SucceedingCombo = ReturnType<TypeHardcodedAsParameterWithoutReturnType<'Boat', keyof DataFetchFns['Boat']>>;
83+
>SucceedingCombo : Symbol(SucceedingCombo, Decl(constraintWithIndexedAccess.ts, 20, 74))
84+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
85+
>TypeHardcodedAsParameterWithoutReturnType : Symbol(TypeHardcodedAsParameterWithoutReturnType, Decl(constraintWithIndexedAccess.ts, 17, 112))
86+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
87+
88+
export type FailingCombo<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<TypeHardcodedAsParameterWithoutReturnType<T,F>>;
89+
>FailingCombo : Symbol(FailingCombo, Decl(constraintWithIndexedAccess.ts, 21, 120))
90+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 22, 25))
91+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 22, 42))
92+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
93+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 22, 25))
94+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
95+
>TypeHardcodedAsParameterWithoutReturnType : Symbol(TypeHardcodedAsParameterWithoutReturnType, Decl(constraintWithIndexedAccess.ts, 17, 112))
96+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 22, 25))
97+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 22, 42))
98+
99+
export type TypeHardcodedAsParameter<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][F]>;
100+
>TypeHardcodedAsParameter : Symbol(TypeHardcodedAsParameter, Decl(constraintWithIndexedAccess.ts, 22, 137))
101+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 23, 37))
102+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 23, 54))
103+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
104+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 23, 37))
105+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
106+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
107+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 23, 37))
108+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 23, 54))
109+
110+
type VehicleSelector<T extends keyof DataFetchFns> = DataFetchFns[T];
111+
>VehicleSelector : Symbol(VehicleSelector, Decl(constraintWithIndexedAccess.ts, 23, 121))
112+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 24, 21))
113+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
114+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
115+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 24, 21))
116+
117+
export type TypeHardcodedAsParameter2<T extends 'Boat', F extends keyof DataFetchFns[T]> = ReturnType<VehicleSelector<T>[F]>;
118+
>TypeHardcodedAsParameter2 : Symbol(TypeHardcodedAsParameter2, Decl(constraintWithIndexedAccess.ts, 24, 69))
119+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 25, 38))
120+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 25, 55))
121+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
122+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 25, 38))
123+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
124+
>VehicleSelector : Symbol(VehicleSelector, Decl(constraintWithIndexedAccess.ts, 23, 121))
125+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 25, 38))
126+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 25, 55))
127+
128+
export type TypeGeneric1<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][F]>;
129+
>TypeGeneric1 : Symbol(TypeGeneric1, Decl(constraintWithIndexedAccess.ts, 25, 125))
130+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 26, 25))
131+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
132+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 26, 54))
133+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
134+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 26, 25))
135+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
136+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
137+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 26, 25))
138+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 26, 54))
139+
140+
export type TypeGeneric2<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[T][T]>; // error
141+
>TypeGeneric2 : Symbol(TypeGeneric2, Decl(constraintWithIndexedAccess.ts, 26, 121))
142+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 27, 25))
143+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
144+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 27, 54))
145+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
146+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 27, 25))
147+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
148+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
149+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 27, 25))
150+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 27, 25))
151+
152+
export type TypeGeneric3<T extends keyof DataFetchFns, F extends keyof DataFetchFns[T]> = ReturnType<DataFetchFns[F][F]>; // error
153+
>TypeGeneric3 : Symbol(TypeGeneric3, Decl(constraintWithIndexedAccess.ts, 27, 121))
154+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 28, 25))
155+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
156+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 28, 54))
157+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
158+
>T : Symbol(T, Decl(constraintWithIndexedAccess.ts, 28, 25))
159+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
160+
>DataFetchFns : Symbol(DataFetchFns, Decl(constraintWithIndexedAccess.ts, 0, 0))
161+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 28, 54))
162+
>F : Symbol(F, Decl(constraintWithIndexedAccess.ts, 28, 54))
163+

0 commit comments

Comments
 (0)