From c9b5f2b02262b3c1049e3010a3c587368402bed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Sat, 4 Feb 2023 01:32:22 +0100 Subject: [PATCH] Replace `missingType` with `undefinedType` in the `IndexedAccessTypeNode`'s type (#52016) --- src/compiler/checker.ts | 4 +-- ...icateAcceptingPartialOfRefinedType.symbols | 26 +++++++++++++++++++ ...edicateAcceptingPartialOfRefinedType.types | 17 ++++++++++++ ...ePredicateAcceptingPartialOfRefinedType.ts | 15 +++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.symbols create mode 100644 tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.types create mode 100644 tests/cases/compiler/typePredicateAcceptingPartialOfRefinedType.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6e3448ba929..b1d258e6c2a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -17060,8 +17060,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } const propType = getTypeOfSymbol(prop); - return accessExpression && getAssignmentTargetKind(accessExpression) !== AssignmentKind.Definite ? - getFlowTypeOfReference(accessExpression, propType) : + return accessExpression && getAssignmentTargetKind(accessExpression) !== AssignmentKind.Definite ? getFlowTypeOfReference(accessExpression, propType) : + accessNode && isIndexedAccessTypeNode(accessNode) && containsMissingType(propType) ? getUnionType([propType, undefinedType]) : propType; } if (everyType(objectType, isTupleType) && isNumericLiteralName(propName)) { diff --git a/tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.symbols b/tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.symbols new file mode 100644 index 00000000000..6df3a454fb2 --- /dev/null +++ b/tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.symbols @@ -0,0 +1,26 @@ +=== tests/cases/compiler/typePredicateAcceptingPartialOfRefinedType.ts === +// repro #51953 + +interface Test { +>Test : Symbol(Test, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 0, 0)) + + testy?: string; +>testy : Symbol(Test.testy, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 2, 16)) +} + +interface Options { +>Options : Symbol(Options, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 4, 1)) + + test: Test['testy']; +>test : Symbol(Options.test, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 6, 19)) +>Test : Symbol(Test, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 0, 0)) +} + +declare function includesAllRequiredOptions(options: Partial): options is Options; +>includesAllRequiredOptions : Symbol(includesAllRequiredOptions, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 8, 1)) +>options : Symbol(options, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 10, 44)) +>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --)) +>Options : Symbol(Options, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 4, 1)) +>options : Symbol(options, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 10, 44)) +>Options : Symbol(Options, Decl(typePredicateAcceptingPartialOfRefinedType.ts, 4, 1)) + diff --git a/tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.types b/tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.types new file mode 100644 index 00000000000..b0605fa5351 --- /dev/null +++ b/tests/baselines/reference/typePredicateAcceptingPartialOfRefinedType.types @@ -0,0 +1,17 @@ +=== tests/cases/compiler/typePredicateAcceptingPartialOfRefinedType.ts === +// repro #51953 + +interface Test { + testy?: string; +>testy : string | undefined +} + +interface Options { + test: Test['testy']; +>test : string | undefined +} + +declare function includesAllRequiredOptions(options: Partial): options is Options; +>includesAllRequiredOptions : (options: Partial) => options is Options +>options : Partial + diff --git a/tests/cases/compiler/typePredicateAcceptingPartialOfRefinedType.ts b/tests/cases/compiler/typePredicateAcceptingPartialOfRefinedType.ts new file mode 100644 index 00000000000..f15632e59c9 --- /dev/null +++ b/tests/cases/compiler/typePredicateAcceptingPartialOfRefinedType.ts @@ -0,0 +1,15 @@ +// @strict: true +// @exactOptionalPropertyTypes: true +// @noEmit: true + +// repro #51953 + +interface Test { + testy?: string; +} + +interface Options { + test: Test['testy']; +} + +declare function includesAllRequiredOptions(options: Partial): options is Options;