diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9014e2f43f..ac46ee7e16 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7305,8 +7305,8 @@ namespace ts { if (strictNullChecks && declaration.flags & NodeFlags.Ambient && isParameterDeclaration(declaration)) { parentType = getNonNullableType(parentType); } - // Filter `undefined` from the type we check against if the parent has an initializer (which handles the `undefined` case implicitly) - else if (strictNullChecks && pattern.parent.initializer && isParameter(pattern.parent)) { + // Filter `undefined` from the type we check against if the parent has an initializer and that initializer is not possibly `undefined` + else if (strictNullChecks && pattern.parent.initializer && !(getTypeFacts(getTypeOfInitializer(pattern.parent.initializer)) & TypeFacts.EQUndefined)) { parentType = getTypeWithFacts(parentType, TypeFacts.NEUndefined); } diff --git a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.errors.txt b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.errors.txt index 32ff831d2b..abab02a197 100644 --- a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.errors.txt +++ b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.errors.txt @@ -1,7 +1,8 @@ tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts(7,9): error TS2339: Property 's' does not exist on type '{ s: string; } | undefined'. +tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts(8,16): error TS2339: Property 's' does not exist on type '{ s: string; } | undefined'. -==== tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts (1 errors) ==== +==== tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts (2 errors) ==== const fInferred = ({ a = 0 } = {}) => a; // const fInferred: ({ a }?: { a?: number; }) => number @@ -11,4 +12,7 @@ tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts(7,9 const { s } = t; ~ !!! error TS2339: Property 's' does not exist on type '{ s: string; } | undefined'. + function fst({ s } = t) { } + ~ +!!! error TS2339: Property 's' does not exist on type '{ s: string; } | undefined'. \ No newline at end of file diff --git a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.js b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.js index 8311b6ff48..3003e420e5 100644 --- a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.js +++ b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.js @@ -6,6 +6,7 @@ const fAnnotated: typeof fInferred = ({ a = 0 } = {}) => a; declare var t: { s: string } | undefined; const { s } = t; +function fst({ s } = t) { } //// [contextualTypeForInitalizedVariablesFiltersUndefined.js] @@ -20,3 +21,6 @@ var fAnnotated = function (_a) { return a; }; var s = t.s; +function fst(_a) { + var s = (_a === void 0 ? t : _a).s; +} diff --git a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.symbols b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.symbols index 81ae53f941..749fd47dd1 100644 --- a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.symbols +++ b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.symbols @@ -20,3 +20,8 @@ const { s } = t; >s : Symbol(s, Decl(contextualTypeForInitalizedVariablesFiltersUndefined.ts, 6, 7)) >t : Symbol(t, Decl(contextualTypeForInitalizedVariablesFiltersUndefined.ts, 5, 11)) +function fst({ s } = t) { } +>fst : Symbol(fst, Decl(contextualTypeForInitalizedVariablesFiltersUndefined.ts, 6, 16)) +>s : Symbol(s, Decl(contextualTypeForInitalizedVariablesFiltersUndefined.ts, 7, 14)) +>t : Symbol(t, Decl(contextualTypeForInitalizedVariablesFiltersUndefined.ts, 5, 11)) + diff --git a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.types b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.types index 58580fdacc..f2c72b1708 100644 --- a/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.types +++ b/tests/baselines/reference/contextualTypeForInitalizedVariablesFiltersUndefined.types @@ -26,3 +26,8 @@ const { s } = t; >s : any >t : { s: string; } | undefined +function fst({ s } = t) { } +>fst : ({ s }?: { s: string; } | undefined) => void +>s : any +>t : { s: string; } | undefined + diff --git a/tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts b/tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts index cfa8d8d682..d6d23ba85b 100644 --- a/tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts +++ b/tests/cases/compiler/contextualTypeForInitalizedVariablesFiltersUndefined.ts @@ -6,3 +6,4 @@ const fAnnotated: typeof fInferred = ({ a = 0 } = {}) => a; declare var t: { s: string } | undefined; const { s } = t; +function fst({ s } = t) { }