diff --git a/tests/baselines/reference/checkOrderDependenceGenericAssignability.errors.txt b/tests/baselines/reference/checkOrderDependenceGenericAssignability.errors.txt new file mode 100644 index 00000000000..448081e8daf --- /dev/null +++ b/tests/baselines/reference/checkOrderDependenceGenericAssignability.errors.txt @@ -0,0 +1,92 @@ +tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(21,1): error TS2322: Type 'Parent1' is not assignable to type 'Parent1'. + Type 'unknown' is not assignable to type 'string'. +tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(45,1): error TS2322: Type 'Parent2' is not assignable to type 'Parent2'. + Type 'unknown' is not assignable to type 'string'. +tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(62,1): error TS2322: Type 'Child3' is not assignable to type 'Child3'. + Type 'unknown' is not assignable to type 'string'. +tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(68,1): error TS2322: Type 'Parent3' is not assignable to type 'Parent3'. + Type 'unknown' is not assignable to type 'string'. + + +==== tests/cases/compiler/checkOrderDependenceGenericAssignability.ts (4 errors) ==== + // Repro from #44572 with interface types + + interface Parent1 { + child: Child1; + parent: Parent1; + } + + interface Child1 extends Parent1 { + readonly a: A; + readonly b: B; + } + + function fn1(inp: Child1) { + const a: Child1 = inp; + } + + declare let pu1: Parent1; + declare let ps1: Parent1; + + pu1 = ps1; // Ok + ps1 = pu1; // Error expected + ~~~ +!!! error TS2322: Type 'Parent1' is not assignable to type 'Parent1'. +!!! error TS2322: Type 'unknown' is not assignable to type 'string'. + + // Repro from #44572 with aliased object types + + type Parent2 = { + child: Child2; + parent: Parent2; + } + + type Child2 = { + child: Child2; + parent: Parent2; + readonly a: A; + readonly b: B; + } + + function fn2(inp: Child2) { + const a: Child2 = inp; + } + + declare let pu2: Parent2; + declare let ps2: Parent2; + + pu2 = ps2; // Ok + ps2 = pu2; // Error expected + ~~~ +!!! error TS2322: Type 'Parent2' is not assignable to type 'Parent2'. +!!! error TS2322: Type 'unknown' is not assignable to type 'string'. + + // Simpler repro for same issue + + interface Parent3 { + child: Child3; + parent: Parent3; + } + + interface Child3 extends Parent3 { + readonly a: A; + } + + declare let cu3: Child3; + declare let cs3: Child3; + + cu3 = cs3; // Ok + cs3 = cu3; // Error expected + ~~~ +!!! error TS2322: Type 'Child3' is not assignable to type 'Child3'. +!!! error TS2322: Type 'unknown' is not assignable to type 'string'. + + declare let pu3: Parent3; + declare let ps3: Parent3; + + pu3 = ps3; // Ok + ps3 = pu3; // Error expected + ~~~ +!!! error TS2322: Type 'Parent3' is not assignable to type 'Parent3'. +!!! error TS2322: Type 'unknown' is not assignable to type 'string'. + \ No newline at end of file diff --git a/tests/baselines/reference/checkOrderDependenceGenericAssignability.js b/tests/baselines/reference/checkOrderDependenceGenericAssignability.js new file mode 100644 index 00000000000..c88526e85bf --- /dev/null +++ b/tests/baselines/reference/checkOrderDependenceGenericAssignability.js @@ -0,0 +1,88 @@ +//// [checkOrderDependenceGenericAssignability.ts] +// Repro from #44572 with interface types + +interface Parent1 { + child: Child1; + parent: Parent1; +} + +interface Child1 extends Parent1 { + readonly a: A; + readonly b: B; +} + +function fn1(inp: Child1) { + const a: Child1 = inp; +} + +declare let pu1: Parent1; +declare let ps1: Parent1; + +pu1 = ps1; // Ok +ps1 = pu1; // Error expected + +// Repro from #44572 with aliased object types + +type Parent2 = { + child: Child2; + parent: Parent2; +} + +type Child2 = { + child: Child2; + parent: Parent2; + readonly a: A; + readonly b: B; +} + +function fn2(inp: Child2) { + const a: Child2 = inp; +} + +declare let pu2: Parent2; +declare let ps2: Parent2; + +pu2 = ps2; // Ok +ps2 = pu2; // Error expected + +// Simpler repro for same issue + +interface Parent3 { + child: Child3; + parent: Parent3; +} + +interface Child3 extends Parent3 { + readonly a: A; +} + +declare let cu3: Child3; +declare let cs3: Child3; + +cu3 = cs3; // Ok +cs3 = cu3; // Error expected + +declare let pu3: Parent3; +declare let ps3: Parent3; + +pu3 = ps3; // Ok +ps3 = pu3; // Error expected + + +//// [checkOrderDependenceGenericAssignability.js] +"use strict"; +// Repro from #44572 with interface types +function fn1(inp) { + var a = inp; +} +pu1 = ps1; // Ok +ps1 = pu1; // Error expected +function fn2(inp) { + var a = inp; +} +pu2 = ps2; // Ok +ps2 = pu2; // Error expected +cu3 = cs3; // Ok +cs3 = cu3; // Error expected +pu3 = ps3; // Ok +ps3 = pu3; // Error expected diff --git a/tests/baselines/reference/checkOrderDependenceGenericAssignability.symbols b/tests/baselines/reference/checkOrderDependenceGenericAssignability.symbols new file mode 100644 index 00000000000..8bbda871914 --- /dev/null +++ b/tests/baselines/reference/checkOrderDependenceGenericAssignability.symbols @@ -0,0 +1,193 @@ +=== tests/cases/compiler/checkOrderDependenceGenericAssignability.ts === +// Repro from #44572 with interface types + +interface Parent1 { +>Parent1 : Symbol(Parent1, Decl(checkOrderDependenceGenericAssignability.ts, 0, 0)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 2, 18)) + + child: Child1; +>child : Symbol(Parent1.child, Decl(checkOrderDependenceGenericAssignability.ts, 2, 22)) +>Child1 : Symbol(Child1, Decl(checkOrderDependenceGenericAssignability.ts, 5, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 2, 18)) + + parent: Parent1; +>parent : Symbol(Parent1.parent, Decl(checkOrderDependenceGenericAssignability.ts, 3, 21)) +>Parent1 : Symbol(Parent1, Decl(checkOrderDependenceGenericAssignability.ts, 0, 0)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 2, 18)) +} + +interface Child1 extends Parent1 { +>Child1 : Symbol(Child1, Decl(checkOrderDependenceGenericAssignability.ts, 5, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 7, 17)) +>B : Symbol(B, Decl(checkOrderDependenceGenericAssignability.ts, 7, 19)) +>Parent1 : Symbol(Parent1, Decl(checkOrderDependenceGenericAssignability.ts, 0, 0)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 7, 17)) + + readonly a: A; +>a : Symbol(Child1.a, Decl(checkOrderDependenceGenericAssignability.ts, 7, 53)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 7, 17)) + + readonly b: B; +>b : Symbol(Child1.b, Decl(checkOrderDependenceGenericAssignability.ts, 8, 18)) +>B : Symbol(B, Decl(checkOrderDependenceGenericAssignability.ts, 7, 19)) +} + +function fn1(inp: Child1) { +>fn1 : Symbol(fn1, Decl(checkOrderDependenceGenericAssignability.ts, 10, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 12, 13)) +>inp : Symbol(inp, Decl(checkOrderDependenceGenericAssignability.ts, 12, 16)) +>Child1 : Symbol(Child1, Decl(checkOrderDependenceGenericAssignability.ts, 5, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 12, 13)) + + const a: Child1 = inp; +>a : Symbol(a, Decl(checkOrderDependenceGenericAssignability.ts, 13, 9)) +>Child1 : Symbol(Child1, Decl(checkOrderDependenceGenericAssignability.ts, 5, 1)) +>inp : Symbol(inp, Decl(checkOrderDependenceGenericAssignability.ts, 12, 16)) +} + +declare let pu1: Parent1; +>pu1 : Symbol(pu1, Decl(checkOrderDependenceGenericAssignability.ts, 16, 11)) +>Parent1 : Symbol(Parent1, Decl(checkOrderDependenceGenericAssignability.ts, 0, 0)) + +declare let ps1: Parent1; +>ps1 : Symbol(ps1, Decl(checkOrderDependenceGenericAssignability.ts, 17, 11)) +>Parent1 : Symbol(Parent1, Decl(checkOrderDependenceGenericAssignability.ts, 0, 0)) + +pu1 = ps1; // Ok +>pu1 : Symbol(pu1, Decl(checkOrderDependenceGenericAssignability.ts, 16, 11)) +>ps1 : Symbol(ps1, Decl(checkOrderDependenceGenericAssignability.ts, 17, 11)) + +ps1 = pu1; // Error expected +>ps1 : Symbol(ps1, Decl(checkOrderDependenceGenericAssignability.ts, 17, 11)) +>pu1 : Symbol(pu1, Decl(checkOrderDependenceGenericAssignability.ts, 16, 11)) + +// Repro from #44572 with aliased object types + +type Parent2 = { +>Parent2 : Symbol(Parent2, Decl(checkOrderDependenceGenericAssignability.ts, 20, 10)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 24, 13)) + + child: Child2; +>child : Symbol(child, Decl(checkOrderDependenceGenericAssignability.ts, 24, 19)) +>Child2 : Symbol(Child2, Decl(checkOrderDependenceGenericAssignability.ts, 27, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 24, 13)) + + parent: Parent2; +>parent : Symbol(parent, Decl(checkOrderDependenceGenericAssignability.ts, 25, 21)) +>Parent2 : Symbol(Parent2, Decl(checkOrderDependenceGenericAssignability.ts, 20, 10)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 24, 13)) +} + +type Child2 = { +>Child2 : Symbol(Child2, Decl(checkOrderDependenceGenericAssignability.ts, 27, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 29, 12)) +>B : Symbol(B, Decl(checkOrderDependenceGenericAssignability.ts, 29, 14)) + + child: Child2; +>child : Symbol(child, Decl(checkOrderDependenceGenericAssignability.ts, 29, 31)) +>Child2 : Symbol(Child2, Decl(checkOrderDependenceGenericAssignability.ts, 27, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 29, 12)) + + parent: Parent2; +>parent : Symbol(parent, Decl(checkOrderDependenceGenericAssignability.ts, 30, 21)) +>Parent2 : Symbol(Parent2, Decl(checkOrderDependenceGenericAssignability.ts, 20, 10)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 29, 12)) + + readonly a: A; +>a : Symbol(a, Decl(checkOrderDependenceGenericAssignability.ts, 31, 23)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 29, 12)) + + readonly b: B; +>b : Symbol(b, Decl(checkOrderDependenceGenericAssignability.ts, 32, 18)) +>B : Symbol(B, Decl(checkOrderDependenceGenericAssignability.ts, 29, 14)) +} + +function fn2(inp: Child2) { +>fn2 : Symbol(fn2, Decl(checkOrderDependenceGenericAssignability.ts, 34, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 36, 13)) +>inp : Symbol(inp, Decl(checkOrderDependenceGenericAssignability.ts, 36, 16)) +>Child2 : Symbol(Child2, Decl(checkOrderDependenceGenericAssignability.ts, 27, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 36, 13)) + + const a: Child2 = inp; +>a : Symbol(a, Decl(checkOrderDependenceGenericAssignability.ts, 37, 9)) +>Child2 : Symbol(Child2, Decl(checkOrderDependenceGenericAssignability.ts, 27, 1)) +>inp : Symbol(inp, Decl(checkOrderDependenceGenericAssignability.ts, 36, 16)) +} + +declare let pu2: Parent2; +>pu2 : Symbol(pu2, Decl(checkOrderDependenceGenericAssignability.ts, 40, 11)) +>Parent2 : Symbol(Parent2, Decl(checkOrderDependenceGenericAssignability.ts, 20, 10)) + +declare let ps2: Parent2; +>ps2 : Symbol(ps2, Decl(checkOrderDependenceGenericAssignability.ts, 41, 11)) +>Parent2 : Symbol(Parent2, Decl(checkOrderDependenceGenericAssignability.ts, 20, 10)) + +pu2 = ps2; // Ok +>pu2 : Symbol(pu2, Decl(checkOrderDependenceGenericAssignability.ts, 40, 11)) +>ps2 : Symbol(ps2, Decl(checkOrderDependenceGenericAssignability.ts, 41, 11)) + +ps2 = pu2; // Error expected +>ps2 : Symbol(ps2, Decl(checkOrderDependenceGenericAssignability.ts, 41, 11)) +>pu2 : Symbol(pu2, Decl(checkOrderDependenceGenericAssignability.ts, 40, 11)) + +// Simpler repro for same issue + +interface Parent3 { +>Parent3 : Symbol(Parent3, Decl(checkOrderDependenceGenericAssignability.ts, 44, 10)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 48, 18)) + + child: Child3; +>child : Symbol(Parent3.child, Decl(checkOrderDependenceGenericAssignability.ts, 48, 22)) +>Child3 : Symbol(Child3, Decl(checkOrderDependenceGenericAssignability.ts, 51, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 48, 18)) + + parent: Parent3; +>parent : Symbol(Parent3.parent, Decl(checkOrderDependenceGenericAssignability.ts, 49, 23)) +>Parent3 : Symbol(Parent3, Decl(checkOrderDependenceGenericAssignability.ts, 44, 10)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 48, 18)) +} + +interface Child3 extends Parent3 { +>Child3 : Symbol(Child3, Decl(checkOrderDependenceGenericAssignability.ts, 51, 1)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 53, 17)) +>Parent3 : Symbol(Parent3, Decl(checkOrderDependenceGenericAssignability.ts, 44, 10)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 53, 17)) + + readonly a: A; +>a : Symbol(Child3.a, Decl(checkOrderDependenceGenericAssignability.ts, 53, 40)) +>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 53, 17)) +} + +declare let cu3: Child3; +>cu3 : Symbol(cu3, Decl(checkOrderDependenceGenericAssignability.ts, 57, 11)) +>Child3 : Symbol(Child3, Decl(checkOrderDependenceGenericAssignability.ts, 51, 1)) + +declare let cs3: Child3; +>cs3 : Symbol(cs3, Decl(checkOrderDependenceGenericAssignability.ts, 58, 11)) +>Child3 : Symbol(Child3, Decl(checkOrderDependenceGenericAssignability.ts, 51, 1)) + +cu3 = cs3; // Ok +>cu3 : Symbol(cu3, Decl(checkOrderDependenceGenericAssignability.ts, 57, 11)) +>cs3 : Symbol(cs3, Decl(checkOrderDependenceGenericAssignability.ts, 58, 11)) + +cs3 = cu3; // Error expected +>cs3 : Symbol(cs3, Decl(checkOrderDependenceGenericAssignability.ts, 58, 11)) +>cu3 : Symbol(cu3, Decl(checkOrderDependenceGenericAssignability.ts, 57, 11)) + +declare let pu3: Parent3; +>pu3 : Symbol(pu3, Decl(checkOrderDependenceGenericAssignability.ts, 63, 11)) +>Parent3 : Symbol(Parent3, Decl(checkOrderDependenceGenericAssignability.ts, 44, 10)) + +declare let ps3: Parent3; +>ps3 : Symbol(ps3, Decl(checkOrderDependenceGenericAssignability.ts, 64, 11)) +>Parent3 : Symbol(Parent3, Decl(checkOrderDependenceGenericAssignability.ts, 44, 10)) + +pu3 = ps3; // Ok +>pu3 : Symbol(pu3, Decl(checkOrderDependenceGenericAssignability.ts, 63, 11)) +>ps3 : Symbol(ps3, Decl(checkOrderDependenceGenericAssignability.ts, 64, 11)) + +ps3 = pu3; // Error expected +>ps3 : Symbol(ps3, Decl(checkOrderDependenceGenericAssignability.ts, 64, 11)) +>pu3 : Symbol(pu3, Decl(checkOrderDependenceGenericAssignability.ts, 63, 11)) + diff --git a/tests/baselines/reference/checkOrderDependenceGenericAssignability.types b/tests/baselines/reference/checkOrderDependenceGenericAssignability.types new file mode 100644 index 00000000000..afe81326fbc --- /dev/null +++ b/tests/baselines/reference/checkOrderDependenceGenericAssignability.types @@ -0,0 +1,144 @@ +=== tests/cases/compiler/checkOrderDependenceGenericAssignability.ts === +// Repro from #44572 with interface types + +interface Parent1 { + child: Child1; +>child : Child1 + + parent: Parent1; +>parent : Parent1 +} + +interface Child1 extends Parent1 { + readonly a: A; +>a : A + + readonly b: B; +>b : B +} + +function fn1(inp: Child1) { +>fn1 : (inp: Child1) => void +>inp : Child1 + + const a: Child1 = inp; +>a : Child1 +>inp : Child1 +} + +declare let pu1: Parent1; +>pu1 : Parent1 + +declare let ps1: Parent1; +>ps1 : Parent1 + +pu1 = ps1; // Ok +>pu1 = ps1 : Parent1 +>pu1 : Parent1 +>ps1 : Parent1 + +ps1 = pu1; // Error expected +>ps1 = pu1 : Parent1 +>ps1 : Parent1 +>pu1 : Parent1 + +// Repro from #44572 with aliased object types + +type Parent2 = { +>Parent2 : Parent2 + + child: Child2; +>child : Child2 + + parent: Parent2; +>parent : Parent2 +} + +type Child2 = { +>Child2 : Child2 + + child: Child2; +>child : Child2 + + parent: Parent2; +>parent : Parent2 + + readonly a: A; +>a : A + + readonly b: B; +>b : B +} + +function fn2(inp: Child2) { +>fn2 : (inp: Child2) => void +>inp : Child2 + + const a: Child2 = inp; +>a : Child2 +>inp : Child2 +} + +declare let pu2: Parent2; +>pu2 : Parent2 + +declare let ps2: Parent2; +>ps2 : Parent2 + +pu2 = ps2; // Ok +>pu2 = ps2 : Parent2 +>pu2 : Parent2 +>ps2 : Parent2 + +ps2 = pu2; // Error expected +>ps2 = pu2 : Parent2 +>ps2 : Parent2 +>pu2 : Parent2 + +// Simpler repro for same issue + +interface Parent3 { + child: Child3; +>child : Child3 + + parent: Parent3; +>parent : Parent3 +} + +interface Child3 extends Parent3 { + readonly a: A; +>a : A +} + +declare let cu3: Child3; +>cu3 : Child3 + +declare let cs3: Child3; +>cs3 : Child3 + +cu3 = cs3; // Ok +>cu3 = cs3 : Child3 +>cu3 : Child3 +>cs3 : Child3 + +cs3 = cu3; // Error expected +>cs3 = cu3 : Child3 +>cs3 : Child3 +>cu3 : Child3 + +declare let pu3: Parent3; +>pu3 : Parent3 + +declare let ps3: Parent3; +>ps3 : Parent3 + +pu3 = ps3; // Ok +>pu3 = ps3 : Parent3 +>pu3 : Parent3 +>ps3 : Parent3 + +ps3 = pu3; // Error expected +>ps3 = pu3 : Parent3 +>ps3 : Parent3 +>pu3 : Parent3 + diff --git a/tests/cases/compiler/checkOrderDependenceGenericAssignability.ts b/tests/cases/compiler/checkOrderDependenceGenericAssignability.ts new file mode 100644 index 00000000000..b4701ed36dc --- /dev/null +++ b/tests/cases/compiler/checkOrderDependenceGenericAssignability.ts @@ -0,0 +1,70 @@ +// @strict: true + +// Repro from #44572 with interface types + +interface Parent1 { + child: Child1; + parent: Parent1; +} + +interface Child1 extends Parent1 { + readonly a: A; + readonly b: B; +} + +function fn1(inp: Child1) { + const a: Child1 = inp; +} + +declare let pu1: Parent1; +declare let ps1: Parent1; + +pu1 = ps1; // Ok +ps1 = pu1; // Error expected + +// Repro from #44572 with aliased object types + +type Parent2 = { + child: Child2; + parent: Parent2; +} + +type Child2 = { + child: Child2; + parent: Parent2; + readonly a: A; + readonly b: B; +} + +function fn2(inp: Child2) { + const a: Child2 = inp; +} + +declare let pu2: Parent2; +declare let ps2: Parent2; + +pu2 = ps2; // Ok +ps2 = pu2; // Error expected + +// Simpler repro for same issue + +interface Parent3 { + child: Child3; + parent: Parent3; +} + +interface Child3 extends Parent3 { + readonly a: A; +} + +declare let cu3: Child3; +declare let cs3: Child3; + +cu3 = cs3; // Ok +cs3 = cu3; // Error expected + +declare let pu3: Parent3; +declare let ps3: Parent3; + +pu3 = ps3; // Ok +ps3 = pu3; // Error expected