diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3be17bfdaa6da..23a49e551757c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -25891,6 +25891,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (!nonConstructorTypeInUnion) return type; } + if (assumeTrue && declaredType === unknownType && isEmptyAnonymousObjectType(type)) { + return targetType; + } + return getNarrowedType(type, targetType, assumeTrue, /*checkDerived*/ true); } diff --git a/tests/baselines/reference/inKeywordAndUnknown.errors.txt b/tests/baselines/reference/inKeywordAndUnknown.errors.txt index 61c2cd2a2a364..41dde018c8913 100644 --- a/tests/baselines/reference/inKeywordAndUnknown.errors.txt +++ b/tests/baselines/reference/inKeywordAndUnknown.errors.txt @@ -20,4 +20,17 @@ tests/cases/compiler/inKeywordAndUnknown.ts(12,18): error TS2638: Type '{}' may } y; // {} } + + + // repro #51007 + function isHTMLTable(table: unknown): boolean { + return !!table && table instanceof Object && 'html' in table; + } + + function tryGetHtmlPropFromTable(table: unknown) { + if (!!table && table instanceof Object && 'html' in table && table.html instanceof Object) { + return table.html; + } + return undefined; + } \ No newline at end of file diff --git a/tests/baselines/reference/inKeywordAndUnknown.js b/tests/baselines/reference/inKeywordAndUnknown.js index 354bb8c4b1884..9a25c77e6268c 100644 --- a/tests/baselines/reference/inKeywordAndUnknown.js +++ b/tests/baselines/reference/inKeywordAndUnknown.js @@ -15,6 +15,19 @@ function f(x: {}, y: unknown) { } y; // {} } + + +// repro #51007 +function isHTMLTable(table: unknown): boolean { + return !!table && table instanceof Object && 'html' in table; +} + +function tryGetHtmlPropFromTable(table: unknown) { + if (!!table && table instanceof Object && 'html' in table && table.html instanceof Object) { + return table.html; + } + return undefined; +} //// [inKeywordAndUnknown.js] @@ -34,3 +47,13 @@ function f(x, y) { } y; // {} } +// repro #51007 +function isHTMLTable(table) { + return !!table && table instanceof Object && 'html' in table; +} +function tryGetHtmlPropFromTable(table) { + if (!!table && table instanceof Object && 'html' in table && table.html instanceof Object) { + return table.html; + } + return undefined; +} diff --git a/tests/baselines/reference/inKeywordAndUnknown.symbols b/tests/baselines/reference/inKeywordAndUnknown.symbols index 145e92dc7f657..ddef5c201b058 100644 --- a/tests/baselines/reference/inKeywordAndUnknown.symbols +++ b/tests/baselines/reference/inKeywordAndUnknown.symbols @@ -31,3 +31,39 @@ function f(x: {}, y: unknown) { >y : Symbol(y, Decl(inKeywordAndUnknown.ts, 2, 17)) } + +// repro #51007 +function isHTMLTable(table: unknown): boolean { +>isHTMLTable : Symbol(isHTMLTable, Decl(inKeywordAndUnknown.ts, 15, 1)) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 19, 21)) + + return !!table && table instanceof Object && 'html' in table; +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 19, 21)) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 19, 21)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 19, 21)) +} + +function tryGetHtmlPropFromTable(table: unknown) { +>tryGetHtmlPropFromTable : Symbol(tryGetHtmlPropFromTable, Decl(inKeywordAndUnknown.ts, 21, 1)) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 23, 33)) + + if (!!table && table instanceof Object && 'html' in table && table.html instanceof Object) { +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 23, 33)) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 23, 33)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 23, 33)) +>table.html : Symbol(html) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 23, 33)) +>html : Symbol(html) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) + + return table.html; +>table.html : Symbol(html) +>table : Symbol(table, Decl(inKeywordAndUnknown.ts, 23, 33)) +>html : Symbol(html) + } + return undefined; +>undefined : Symbol(undefined) +} + diff --git a/tests/baselines/reference/inKeywordAndUnknown.types b/tests/baselines/reference/inKeywordAndUnknown.types index 59a587598b23d..a19888f7a9a3d 100644 --- a/tests/baselines/reference/inKeywordAndUnknown.types +++ b/tests/baselines/reference/inKeywordAndUnknown.types @@ -40,3 +40,55 @@ function f(x: {}, y: unknown) { >y : Record<"a", unknown> } + +// repro #51007 +function isHTMLTable(table: unknown): boolean { +>isHTMLTable : (table: unknown) => boolean +>table : unknown + + return !!table && table instanceof Object && 'html' in table; +>!!table && table instanceof Object && 'html' in table : boolean +>!!table && table instanceof Object : boolean +>!!table : boolean +>!table : boolean +>table : unknown +>table instanceof Object : boolean +>table : {} +>Object : ObjectConstructor +>'html' in table : boolean +>'html' : "html" +>table : Object +} + +function tryGetHtmlPropFromTable(table: unknown) { +>tryGetHtmlPropFromTable : (table: unknown) => Object | undefined +>table : unknown + + if (!!table && table instanceof Object && 'html' in table && table.html instanceof Object) { +>!!table && table instanceof Object && 'html' in table && table.html instanceof Object : boolean +>!!table && table instanceof Object && 'html' in table : boolean +>!!table && table instanceof Object : boolean +>!!table : boolean +>!table : boolean +>table : unknown +>table instanceof Object : boolean +>table : {} +>Object : ObjectConstructor +>'html' in table : boolean +>'html' : "html" +>table : Object +>table.html instanceof Object : boolean +>table.html : unknown +>table : Object & Record<"html", unknown> +>html : unknown +>Object : ObjectConstructor + + return table.html; +>table.html : Object +>table : Object & Record<"html", unknown> +>html : Object + } + return undefined; +>undefined : undefined +} + diff --git a/tests/cases/compiler/inKeywordAndUnknown.ts b/tests/cases/compiler/inKeywordAndUnknown.ts index 745dfbc1f9af5..cf27e39736894 100644 --- a/tests/cases/compiler/inKeywordAndUnknown.ts +++ b/tests/cases/compiler/inKeywordAndUnknown.ts @@ -16,3 +16,16 @@ function f(x: {}, y: unknown) { } y; // {} } + + +// repro #51007 +function isHTMLTable(table: unknown): boolean { + return !!table && table instanceof Object && 'html' in table; +} + +function tryGetHtmlPropFromTable(table: unknown) { + if (!!table && table instanceof Object && 'html' in table && table.html instanceof Object) { + return table.html; + } + return undefined; +}