@@ -8367,33 +8367,35 @@ namespace ts {
8367
8367
// undefined if no transformation is possible.
8368
8368
function getSimplifiedIndexedAccessType(type: IndexedAccessType): Type {
8369
8369
const objectType = type.objectType;
8370
- // Given an indexed access type T[K], if T is an intersection containing one or more generic types and one or
8371
- // more object types with only a string index signature, e.g. '(U & V & { [x: string]: D })[K]', return a
8372
- // transformed type of the form '(U & V)[K] | D'. This allows us to properly reason about higher order indexed
8373
- // access types with default property values as expressed by D.
8374
- if (objectType.flags & TypeFlags.Intersection && isGenericObjectType(objectType) && some((<IntersectionType>objectType).types, isStringIndexOnlyType)) {
8375
- const regularTypes: Type[] = [];
8376
- const stringIndexTypes: Type[] = [];
8377
- for (const t of (<IntersectionType>objectType).types) {
8378
- if (isStringIndexOnlyType(t)) {
8379
- stringIndexTypes.push(getIndexTypeOfType(t, IndexKind.String));
8380
- }
8381
- else {
8382
- regularTypes.push(t);
8370
+ if (objectType.flags & TypeFlags.Intersection && isGenericObjectType(objectType)) {
8371
+ // Given an indexed access type T[K], if T is an intersection containing one or more generic types and one or
8372
+ // more object types with only a string index signature, e.g. '(U & V & { [x: string]: D })[K]', return a
8373
+ // transformed type of the form '(U & V)[K] | D'. This allows us to properly reason about higher order indexed
8374
+ // access types with default property values as expressed by D.
8375
+ if (some((<IntersectionType>objectType).types, isStringIndexOnlyType)) {
8376
+ const regularTypes: Type[] = [];
8377
+ const stringIndexTypes: Type[] = [];
8378
+ for (const t of (<IntersectionType>objectType).types) {
8379
+ if (isStringIndexOnlyType(t)) {
8380
+ stringIndexTypes.push(getIndexTypeOfType(t, IndexKind.String));
8381
+ }
8382
+ else {
8383
+ regularTypes.push(t);
8384
+ }
8383
8385
}
8386
+ return getUnionType([
8387
+ getIndexedAccessType(getIntersectionType(regularTypes), type.indexType),
8388
+ getIntersectionType(stringIndexTypes)
8389
+ ]);
8390
+ }
8391
+ // Given an indexed access type T[K], if T is an intersection containing one or more generic types and one or
8392
+ // more mapped types with a template type `never`, '(U & V & { [P in T]: never })[K]', return a
8393
+ // transformed type that removes the never-mapped type: '(U & V)[K]'. This mirrors what would happen
8394
+ // eventually anyway, but it easier to reason about.
8395
+ if (some((<IntersectionType>objectType).types, isMappedTypeToNever)) {
8396
+ const nonNeverTypes = filter((<IntersectionType>objectType).types, t => !isMappedTypeToNever(t));
8397
+ return getIndexedAccessType(getIntersectionType(nonNeverTypes), type.indexType);
8384
8398
}
8385
- return getUnionType([
8386
- getIndexedAccessType(getIntersectionType(regularTypes), type.indexType),
8387
- getIntersectionType(stringIndexTypes)
8388
- ]);
8389
- }
8390
- // Given an indexed access type T[K], if T is an intersection containing one or more generic types and one or
8391
- // more mapped types with a template type `never`, '(U & V & { [P in T]: never })[K]', return a
8392
- // transformed type that removes the never-mapped type: '(U & V)[K]'. This mirrors what would happen
8393
- // eventually anyway, but it easier to reason about.
8394
- if (objectType.flags & TypeFlags.Intersection && isGenericObjectType(objectType) && some((<IntersectionType>objectType).types, isMappedTypeToNever)) {
8395
- const nonNeverTypes = filter((<IntersectionType>objectType).types, t => !isMappedTypeToNever(t));
8396
- return getIndexedAccessType(getIntersectionType(nonNeverTypes), type.indexType);
8397
8399
}
8398
8400
8399
8401
// If the object type is a mapped type { [P in K]: E }, where K is generic, instantiate E using a mapper
0 commit comments