From c63b9f4c41df726bc4fe5e4144de1df43210ed63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 22 Nov 2022 00:21:45 +0100 Subject: [PATCH] Fixed substition types for non-generic indexed accesses --- src/compiler/checker.ts | 3 +-- ...stitutionTypeForNonGenericIndexedAccessType.symbols | 10 ++++++++++ ...ubstitutionTypeForNonGenericIndexedAccessType.types | 6 ++++++ .../substitutionTypeForNonGenericIndexedAccessType.ts | 6 ++++++ 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.symbols create mode 100644 tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.types create mode 100644 tests/cases/compiler/substitutionTypeForNonGenericIndexedAccessType.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8bb8f3869ee44..91ce0e0a147eb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15019,8 +15019,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function getSubstitutionType(baseType: Type, constraint: Type) { - if (constraint.flags & TypeFlags.AnyOrUnknown || constraint === baseType || - !isGenericType(baseType) && !isGenericType(constraint)) { + if (constraint.flags & TypeFlags.AnyOrUnknown || constraint === baseType) { return baseType; } const id = `${getTypeId(baseType)}>${getTypeId(constraint)}`; diff --git a/tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.symbols b/tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.symbols new file mode 100644 index 0000000000000..bb0d2675e36b0 --- /dev/null +++ b/tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.symbols @@ -0,0 +1,10 @@ +=== tests/cases/compiler/substitutionTypeForNonGenericIndexedAccessType.ts === +interface A {} +>A : Symbol(A, Decl(substitutionTypeForNonGenericIndexedAccessType.ts, 0, 0)) + +type B = A extends Record<'foo', string> ? A['foo'] : string; // no error +>B : Symbol(B, Decl(substitutionTypeForNonGenericIndexedAccessType.ts, 0, 14)) +>A : Symbol(A, Decl(substitutionTypeForNonGenericIndexedAccessType.ts, 0, 0)) +>Record : Symbol(Record, Decl(lib.es5.d.ts, --, --)) +>A : Symbol(A, Decl(substitutionTypeForNonGenericIndexedAccessType.ts, 0, 0)) + diff --git a/tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.types b/tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.types new file mode 100644 index 0000000000000..2846f2f192315 --- /dev/null +++ b/tests/baselines/reference/substitutionTypeForNonGenericIndexedAccessType.types @@ -0,0 +1,6 @@ +=== tests/cases/compiler/substitutionTypeForNonGenericIndexedAccessType.ts === +interface A {} + +type B = A extends Record<'foo', string> ? A['foo'] : string; // no error +>B : string + diff --git a/tests/cases/compiler/substitutionTypeForNonGenericIndexedAccessType.ts b/tests/cases/compiler/substitutionTypeForNonGenericIndexedAccessType.ts new file mode 100644 index 0000000000000..bc78add75a1d4 --- /dev/null +++ b/tests/cases/compiler/substitutionTypeForNonGenericIndexedAccessType.ts @@ -0,0 +1,6 @@ +// @strict: true +// @noEmit: true + +interface A {} + +type B = A extends Record<'foo', string> ? A['foo'] : string; // no error