diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 43c9818e623ad..c38e53d569dab 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -20001,7 +20001,7 @@ namespace ts { // Two object types that each have a property that is unmatched in the other are definitely unrelated. return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true) && - !!getUnmatchedProperty(target, source, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ true); + !!getUnmatchedProperty(target, source, /*requireOptionalProperties*/ false, /*matchDiscriminantProperties*/ false); } function getTypeFromInference(inference: InferenceInfo) { diff --git a/tests/baselines/reference/genericRestParameters3.errors.txt b/tests/baselines/reference/genericRestParameters3.errors.txt index 72620c41027dc..7d32573eb556c 100644 --- a/tests/baselines/reference/genericRestParameters3.errors.txt +++ b/tests/baselines/reference/genericRestParameters3.errors.txt @@ -23,8 +23,8 @@ tests/cases/conformance/types/rest/genericRestParameters3.ts(37,21): error TS234 Property '0' is missing in type 'CoolArray' but required in type '[cb: (...args: any[]) => void]'. tests/cases/conformance/types/rest/genericRestParameters3.ts(44,32): error TS2345: Argument of type '[10, 20]' is not assignable to parameter of type 'CoolArray'. Property 'hello' is missing in type '[10, 20]' but required in type 'CoolArray'. -tests/cases/conformance/types/rest/genericRestParameters3.ts(49,1): error TS2345: Argument of type '[]' is not assignable to parameter of type 'CoolArray'. - Property 'hello' is missing in type '[]' but required in type 'CoolArray'. +tests/cases/conformance/types/rest/genericRestParameters3.ts(49,1): error TS2345: Argument of type '[]' is not assignable to parameter of type 'CoolArray'. + Property 'hello' is missing in type '[]' but required in type 'CoolArray'. tests/cases/conformance/types/rest/genericRestParameters3.ts(50,5): error TS2345: Argument of type '[number]' is not assignable to parameter of type 'CoolArray'. Property 'hello' is missing in type '[number]' but required in type 'CoolArray'. tests/cases/conformance/types/rest/genericRestParameters3.ts(51,5): error TS2345: Argument of type '[number, number]' is not assignable to parameter of type 'CoolArray'. @@ -124,8 +124,8 @@ tests/cases/conformance/types/rest/genericRestParameters3.ts(59,5): error TS2345 baz(); // Error ~~~~~ -!!! error TS2345: Argument of type '[]' is not assignable to parameter of type 'CoolArray'. -!!! error TS2345: Property 'hello' is missing in type '[]' but required in type 'CoolArray'. +!!! error TS2345: Argument of type '[]' is not assignable to parameter of type 'CoolArray'. +!!! error TS2345: Property 'hello' is missing in type '[]' but required in type 'CoolArray'. !!! related TS2728 tests/cases/conformance/types/rest/genericRestParameters3.ts:30:5: 'hello' is declared here. baz(1); // Error ~ diff --git a/tests/baselines/reference/inferenceFromIncompleteSource.errors.txt b/tests/baselines/reference/inferenceFromIncompleteSource.errors.txt new file mode 100644 index 0000000000000..442e2253f3bae --- /dev/null +++ b/tests/baselines/reference/inferenceFromIncompleteSource.errors.txt @@ -0,0 +1,21 @@ +tests/cases/compiler/inferenceFromIncompleteSource.ts(11,11): error TS2345: Argument of type '{ items: { name: string; }[]; itemKey: "name"; }' is not assignable to parameter of type 'ListProps<{ name: string; }, "name">'. + Property 'prop' is missing in type '{ items: { name: string; }[]; itemKey: "name"; }' but required in type 'ListProps<{ name: string; }, "name">'. + + +==== tests/cases/compiler/inferenceFromIncompleteSource.ts (1 errors) ==== + // Repro from #42030 + + interface ListProps { + items: T[]; + itemKey: K; + prop: number; + } + + declare const Component: (x: ListProps) => void; + + Component({items: [{name:' string'}], itemKey: 'name' }); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type '{ items: { name: string; }[]; itemKey: "name"; }' is not assignable to parameter of type 'ListProps<{ name: string; }, "name">'. +!!! error TS2345: Property 'prop' is missing in type '{ items: { name: string; }[]; itemKey: "name"; }' but required in type 'ListProps<{ name: string; }, "name">'. +!!! related TS2728 tests/cases/compiler/inferenceFromIncompleteSource.ts:6:3: 'prop' is declared here. + \ No newline at end of file diff --git a/tests/baselines/reference/inferenceFromIncompleteSource.js b/tests/baselines/reference/inferenceFromIncompleteSource.js new file mode 100644 index 0000000000000..0a668fe6c4a67 --- /dev/null +++ b/tests/baselines/reference/inferenceFromIncompleteSource.js @@ -0,0 +1,18 @@ +//// [inferenceFromIncompleteSource.ts] +// Repro from #42030 + +interface ListProps { + items: T[]; + itemKey: K; + prop: number; +} + +declare const Component: (x: ListProps) => void; + +Component({items: [{name:' string'}], itemKey: 'name' }); + + +//// [inferenceFromIncompleteSource.js] +"use strict"; +// Repro from #42030 +Component({ items: [{ name: ' string' }], itemKey: 'name' }); diff --git a/tests/baselines/reference/inferenceFromIncompleteSource.symbols b/tests/baselines/reference/inferenceFromIncompleteSource.symbols new file mode 100644 index 0000000000000..6fb4ae1463a13 --- /dev/null +++ b/tests/baselines/reference/inferenceFromIncompleteSource.symbols @@ -0,0 +1,37 @@ +=== tests/cases/compiler/inferenceFromIncompleteSource.ts === +// Repro from #42030 + +interface ListProps { +>ListProps : Symbol(ListProps, Decl(inferenceFromIncompleteSource.ts, 0, 0)) +>T : Symbol(T, Decl(inferenceFromIncompleteSource.ts, 2, 20)) +>K : Symbol(K, Decl(inferenceFromIncompleteSource.ts, 2, 22)) +>T : Symbol(T, Decl(inferenceFromIncompleteSource.ts, 2, 20)) + + items: T[]; +>items : Symbol(ListProps.items, Decl(inferenceFromIncompleteSource.ts, 2, 43)) +>T : Symbol(T, Decl(inferenceFromIncompleteSource.ts, 2, 20)) + + itemKey: K; +>itemKey : Symbol(ListProps.itemKey, Decl(inferenceFromIncompleteSource.ts, 3, 13)) +>K : Symbol(K, Decl(inferenceFromIncompleteSource.ts, 2, 22)) + + prop: number; +>prop : Symbol(ListProps.prop, Decl(inferenceFromIncompleteSource.ts, 4, 13)) +} + +declare const Component: (x: ListProps) => void; +>Component : Symbol(Component, Decl(inferenceFromIncompleteSource.ts, 8, 13)) +>T : Symbol(T, Decl(inferenceFromIncompleteSource.ts, 8, 26)) +>K : Symbol(K, Decl(inferenceFromIncompleteSource.ts, 8, 28)) +>T : Symbol(T, Decl(inferenceFromIncompleteSource.ts, 8, 26)) +>x : Symbol(x, Decl(inferenceFromIncompleteSource.ts, 8, 48)) +>ListProps : Symbol(ListProps, Decl(inferenceFromIncompleteSource.ts, 0, 0)) +>T : Symbol(T, Decl(inferenceFromIncompleteSource.ts, 8, 26)) +>K : Symbol(K, Decl(inferenceFromIncompleteSource.ts, 8, 28)) + +Component({items: [{name:' string'}], itemKey: 'name' }); +>Component : Symbol(Component, Decl(inferenceFromIncompleteSource.ts, 8, 13)) +>items : Symbol(items, Decl(inferenceFromIncompleteSource.ts, 10, 11)) +>name : Symbol(name, Decl(inferenceFromIncompleteSource.ts, 10, 20)) +>itemKey : Symbol(itemKey, Decl(inferenceFromIncompleteSource.ts, 10, 37)) + diff --git a/tests/baselines/reference/inferenceFromIncompleteSource.types b/tests/baselines/reference/inferenceFromIncompleteSource.types new file mode 100644 index 0000000000000..4ffa4f4beb833 --- /dev/null +++ b/tests/baselines/reference/inferenceFromIncompleteSource.types @@ -0,0 +1,30 @@ +=== tests/cases/compiler/inferenceFromIncompleteSource.ts === +// Repro from #42030 + +interface ListProps { + items: T[]; +>items : T[] + + itemKey: K; +>itemKey : K + + prop: number; +>prop : number +} + +declare const Component: (x: ListProps) => void; +>Component : (x: ListProps) => void +>x : ListProps + +Component({items: [{name:' string'}], itemKey: 'name' }); +>Component({items: [{name:' string'}], itemKey: 'name' }) : void +>Component : (x: ListProps) => void +>{items: [{name:' string'}], itemKey: 'name' } : { items: { name: string; }[]; itemKey: "name"; } +>items : { name: string; }[] +>[{name:' string'}] : { name: string; }[] +>{name:' string'} : { name: string; } +>name : string +>' string' : " string" +>itemKey : "name" +>'name' : "name" + diff --git a/tests/baselines/reference/tsxStatelessFunctionComponentsWithTypeArguments4.errors.txt b/tests/baselines/reference/tsxStatelessFunctionComponentsWithTypeArguments4.errors.txt index c79a623a24238..77dba819da7d9 100644 --- a/tests/baselines/reference/tsxStatelessFunctionComponentsWithTypeArguments4.errors.txt +++ b/tests/baselines/reference/tsxStatelessFunctionComponentsWithTypeArguments4.errors.txt @@ -9,9 +9,9 @@ tests/cases/conformance/jsx/file.tsx(9,14): error TS2769: No overload matches th tests/cases/conformance/jsx/file.tsx(10,15): error TS2769: No overload matches this call. Overload 1 of 3, '(): Element', gave the following error. Type 'T & { "ignore-prop": true; }' has no properties in common with type 'IntrinsicAttributes'. - Overload 2 of 3, '(attr: { b: unknown; a: string; "ignore-prop": boolean; }): Element', gave the following error. - Type 'T & { "ignore-prop": true; }' is not assignable to type 'IntrinsicAttributes & { b: unknown; a: string; "ignore-prop": boolean; }'. - Property 'a' is missing in type '{ b: number; } & { "ignore-prop": true; }' but required in type '{ b: unknown; a: string; "ignore-prop": boolean; }'. + Overload 2 of 3, '(attr: { b: number; a: string; "ignore-prop": boolean; }): Element', gave the following error. + Type 'T & { "ignore-prop": true; }' is not assignable to type 'IntrinsicAttributes & { b: number; a: string; "ignore-prop": boolean; }'. + Property 'a' is missing in type '{ b: number; } & { "ignore-prop": true; }' but required in type '{ b: number; a: string; "ignore-prop": boolean; }'. Overload 3 of 3, '(attr: { b: unknown; a: unknown; }): Element', gave the following error. Type 'T & { "ignore-prop": true; }' is not assignable to type 'IntrinsicAttributes & { b: unknown; a: unknown; }'. Property 'a' is missing in type '{ b: number; } & { "ignore-prop": true; }' but required in type '{ b: unknown; a: unknown; }'. @@ -43,9 +43,9 @@ tests/cases/conformance/jsx/file.tsx(10,15): error TS2769: No overload matches t !!! error TS2769: No overload matches this call. !!! error TS2769: Overload 1 of 3, '(): Element', gave the following error. !!! error TS2769: Type 'T & { "ignore-prop": true; }' has no properties in common with type 'IntrinsicAttributes'. -!!! error TS2769: Overload 2 of 3, '(attr: { b: unknown; a: string; "ignore-prop": boolean; }): Element', gave the following error. -!!! error TS2769: Type 'T & { "ignore-prop": true; }' is not assignable to type 'IntrinsicAttributes & { b: unknown; a: string; "ignore-prop": boolean; }'. -!!! error TS2769: Property 'a' is missing in type '{ b: number; } & { "ignore-prop": true; }' but required in type '{ b: unknown; a: string; "ignore-prop": boolean; }'. +!!! error TS2769: Overload 2 of 3, '(attr: { b: number; a: string; "ignore-prop": boolean; }): Element', gave the following error. +!!! error TS2769: Type 'T & { "ignore-prop": true; }' is not assignable to type 'IntrinsicAttributes & { b: number; a: string; "ignore-prop": boolean; }'. +!!! error TS2769: Property 'a' is missing in type '{ b: number; } & { "ignore-prop": true; }' but required in type '{ b: number; a: string; "ignore-prop": boolean; }'. !!! error TS2769: Overload 3 of 3, '(attr: { b: unknown; a: unknown; }): Element', gave the following error. !!! error TS2769: Type 'T & { "ignore-prop": true; }' is not assignable to type 'IntrinsicAttributes & { b: unknown; a: unknown; }'. !!! error TS2769: Property 'a' is missing in type '{ b: number; } & { "ignore-prop": true; }' but required in type '{ b: unknown; a: unknown; }'. diff --git a/tests/cases/compiler/inferenceFromIncompleteSource.ts b/tests/cases/compiler/inferenceFromIncompleteSource.ts new file mode 100644 index 0000000000000..7f497dd346943 --- /dev/null +++ b/tests/cases/compiler/inferenceFromIncompleteSource.ts @@ -0,0 +1,13 @@ +// @strict: true + +// Repro from #42030 + +interface ListProps { + items: T[]; + itemKey: K; + prop: number; +} + +declare const Component: (x: ListProps) => void; + +Component({items: [{name:' string'}], itemKey: 'name' });