diff --git a/internal/checker/relater.go b/internal/checker/relater.go index 851549487c..5360b732ea 100644 --- a/internal/checker/relater.go +++ b/internal/checker/relater.go @@ -4153,7 +4153,7 @@ func (r *Relater) propertiesRelatedTo(source *Type, target *Type, reportErrors b } return TernaryFalse } - if target.objectFlags&ObjectFlagsFreshLiteral != 0 { + if isObjectLiteralType(target) { for _, sourceProp := range excludeProperties(r.c.getPropertiesOfType(source), excludedProperties) { if r.c.getPropertyOfObjectType(target, sourceProp.Name) == nil { if reportErrors { diff --git a/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.symbols b/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.symbols index 33baa87105..0a28784217 100644 --- a/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.symbols +++ b/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.symbols @@ -29,7 +29,7 @@ function validate() { if(Math.random() > 0.5) { >Math.random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) ->Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>Math : Symbol(Math, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.esnext.float16.d.ts, --, --)) >random : Symbol(Math.random, Decl(lib.es5.d.ts, --, --)) return utilValidate(); @@ -63,3 +63,67 @@ validate().msg; // Error in TSGO >validate : Symbol(validate, Decl(freshObjectLiteralSubtype.ts, 9, 8)) >msg : Symbol(msg, Decl(freshObjectLiteralSubtype.ts, 22, 19), Decl(freshObjectLiteralSubtype.ts, 25, 19)) +// https://github.com/microsoft/typescript-go/issues/1761 + +function normalise_trace_logs([log]: any[]) { +>normalise_trace_logs : Symbol(normalise_trace_logs, Decl(freshObjectLiteralSubtype.ts, 29, 15)) +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 33, 31)) + + let normalised = []; +>normalised : Symbol(normalised, Decl(freshObjectLiteralSubtype.ts, 34, 4)) + + if (typeof log === "string" && log.includes("%c")) { +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 33, 31)) +>log.includes : Symbol(String.includes, Decl(lib.es2015.core.d.ts, --, --)) +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 33, 31)) +>includes : Symbol(String.includes, Decl(lib.es2015.core.d.ts, --, --)) + + normalised.push({ log, highlighted: log.includes("foo") }); +>normalised.push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --)) +>normalised : Symbol(normalised, Decl(freshObjectLiteralSubtype.ts, 34, 4)) +>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --)) +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 36, 25)) +>highlighted : Symbol(highlighted, Decl(freshObjectLiteralSubtype.ts, 36, 30)) +>log.includes : Symbol(String.includes, Decl(lib.es2015.core.d.ts, --, --)) +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 33, 31)) +>includes : Symbol(String.includes, Decl(lib.es2015.core.d.ts, --, --)) + + } else { + normalised.push({ log }); +>normalised.push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --)) +>normalised : Symbol(normalised, Decl(freshObjectLiteralSubtype.ts, 34, 4)) +>push : Symbol(Array.push, Decl(lib.es5.d.ts, --, --)) +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 38, 25)) + } + return normalised; +>normalised : Symbol(normalised, Decl(freshObjectLiteralSubtype.ts, 34, 4)) +} + +function equal(_actual: T, _expected: T): void {} +>equal : Symbol(equal, Decl(freshObjectLiteralSubtype.ts, 41, 1)) +>T : Symbol(T, Decl(freshObjectLiteralSubtype.ts, 43, 15)) +>_actual : Symbol(_actual, Decl(freshObjectLiteralSubtype.ts, 43, 18)) +>T : Symbol(T, Decl(freshObjectLiteralSubtype.ts, 43, 15)) +>_expected : Symbol(_expected, Decl(freshObjectLiteralSubtype.ts, 43, 29)) +>T : Symbol(T, Decl(freshObjectLiteralSubtype.ts, 43, 15)) + +equal(normalise_trace_logs([]), [ +>equal : Symbol(equal, Decl(freshObjectLiteralSubtype.ts, 41, 1)) +>normalise_trace_logs : Symbol(normalise_trace_logs, Decl(freshObjectLiteralSubtype.ts, 29, 15)) + + { log: 'effect' }, +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 46, 5)) + + { log: '$derived', highlighted: true }, +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 47, 5)) +>highlighted : Symbol(highlighted, Decl(freshObjectLiteralSubtype.ts, 47, 22)) + + { log: 'double', highlighted: false }, +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 48, 5)) +>highlighted : Symbol(highlighted, Decl(freshObjectLiteralSubtype.ts, 48, 20)) + + { log: 4 }, +>log : Symbol(log, Decl(freshObjectLiteralSubtype.ts, 49, 5)) + +]); + diff --git a/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.types b/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.types index 67d163471e..4c368aa669 100644 --- a/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.types +++ b/testdata/baselines/reference/compiler/freshObjectLiteralSubtype.types @@ -78,3 +78,91 @@ validate().msg; // Error in TSGO >validate : () => { valid: boolean; msg?: undefined; } | { valid: boolean; msg: string; } >msg : string | undefined +// https://github.com/microsoft/typescript-go/issues/1761 + +function normalise_trace_logs([log]: any[]) { +>normalise_trace_logs : ([log]: any[]) => ({ log: string; highlighted: boolean; } | { highlighted?: undefined; log: any; })[] +>log : any + + let normalised = []; +>normalised : any[] +>[] : never[] + + if (typeof log === "string" && log.includes("%c")) { +>typeof log === "string" && log.includes("%c") : boolean +>typeof log === "string" : boolean +>typeof log : "bigint" | "boolean" | "function" | "number" | "object" | "string" | "symbol" | "undefined" +>log : any +>"string" : "string" +>log.includes("%c") : boolean +>log.includes : (searchString: string, position?: number | undefined) => boolean +>log : string +>includes : (searchString: string, position?: number | undefined) => boolean +>"%c" : "%c" + + normalised.push({ log, highlighted: log.includes("foo") }); +>normalised.push({ log, highlighted: log.includes("foo") }) : number +>normalised.push : (...items: any[]) => number +>normalised : any[] +>push : (...items: any[]) => number +>{ log, highlighted: log.includes("foo") } : { log: string; highlighted: boolean; } +>log : string +>highlighted : boolean +>log.includes("foo") : boolean +>log.includes : (searchString: string, position?: number | undefined) => boolean +>log : string +>includes : (searchString: string, position?: number | undefined) => boolean +>"foo" : "foo" + + } else { + normalised.push({ log }); +>normalised.push({ log }) : number +>normalised.push : (...items: any[]) => number +>normalised : any[] +>push : (...items: any[]) => number +>{ log } : { log: any; } +>log : any + } + return normalised; +>normalised : ({ log: string; highlighted: boolean; } | { log: any; })[] +} + +function equal(_actual: T, _expected: T): void {} +>equal : (_actual: T, _expected: T) => void +>_actual : T +>_expected : T + +equal(normalise_trace_logs([]), [ +>equal(normalise_trace_logs([]), [ { log: 'effect' }, { log: '$derived', highlighted: true }, { log: 'double', highlighted: false }, { log: 4 },]) : void +>equal : (_actual: T, _expected: T) => void +>normalise_trace_logs([]) : ({ log: string; highlighted: boolean; } | { highlighted?: undefined; log: any; })[] +>normalise_trace_logs : ([log]: any[]) => ({ log: string; highlighted: boolean; } | { highlighted?: undefined; log: any; })[] +>[] : never[] +>[ { log: 'effect' }, { log: '$derived', highlighted: true }, { log: 'double', highlighted: false }, { log: 4 },] : ({ log: string; } | { log: string; highlighted: true; } | { log: string; highlighted: false; } | { log: number; })[] + + { log: 'effect' }, +>{ log: 'effect' } : { log: string; } +>log : string +>'effect' : "effect" + + { log: '$derived', highlighted: true }, +>{ log: '$derived', highlighted: true } : { log: string; highlighted: true; } +>log : string +>'$derived' : "$derived" +>highlighted : true +>true : true + + { log: 'double', highlighted: false }, +>{ log: 'double', highlighted: false } : { log: string; highlighted: false; } +>log : string +>'double' : "double" +>highlighted : false +>false : false + + { log: 4 }, +>{ log: 4 } : { log: number; } +>log : number +>4 : 4 + +]); + diff --git a/testdata/tests/cases/compiler/freshObjectLiteralSubtype.ts b/testdata/tests/cases/compiler/freshObjectLiteralSubtype.ts index 750d818586..82707983f4 100644 --- a/testdata/tests/cases/compiler/freshObjectLiteralSubtype.ts +++ b/testdata/tests/cases/compiler/freshObjectLiteralSubtype.ts @@ -1,5 +1,6 @@ // @strict: true // @noEmit: true +// @target: esnext function f1() { if (!!true) { @@ -31,3 +32,24 @@ declare function utilValidate(): { } validate().msg; // Error in TSGO + +// https://github.com/microsoft/typescript-go/issues/1761 + +function normalise_trace_logs([log]: any[]) { + let normalised = []; + if (typeof log === "string" && log.includes("%c")) { + normalised.push({ log, highlighted: log.includes("foo") }); + } else { + normalised.push({ log }); + } + return normalised; +} + +function equal(_actual: T, _expected: T): void {} + +equal(normalise_trace_logs([]), [ + { log: 'effect' }, + { log: '$derived', highlighted: true }, + { log: 'double', highlighted: false }, + { log: 4 }, +]);