Add tests

This commit is contained in:
Anders Hejlsberg
2022-03-01 14:55:42 -08:00
parent fc15aa2bf0
commit de4a166905
5 changed files with 587 additions and 0 deletions
@@ -0,0 +1,92 @@
tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(21,1): error TS2322: Type 'Parent1<unknown>' is not assignable to type 'Parent1<string>'.
Type 'unknown' is not assignable to type 'string'.
tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(45,1): error TS2322: Type 'Parent2<unknown>' is not assignable to type 'Parent2<string>'.
Type 'unknown' is not assignable to type 'string'.
tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(62,1): error TS2322: Type 'Child3<unknown>' is not assignable to type 'Child3<string>'.
Type 'unknown' is not assignable to type 'string'.
tests/cases/compiler/checkOrderDependenceGenericAssignability.ts(68,1): error TS2322: Type 'Parent3<unknown>' is not assignable to type 'Parent3<string>'.
Type 'unknown' is not assignable to type 'string'.
==== tests/cases/compiler/checkOrderDependenceGenericAssignability.ts (4 errors) ====
// Repro from #44572 with interface types
interface Parent1<A> {
child: Child1<A>;
parent: Parent1<A>;
}
interface Child1<A, B = unknown> extends Parent1<A> {
readonly a: A;
readonly b: B;
}
function fn1<A>(inp: Child1<A>) {
const a: Child1<unknown> = inp;
}
declare let pu1: Parent1<unknown>;
declare let ps1: Parent1<string>;
pu1 = ps1; // Ok
ps1 = pu1; // Error expected
~~~
!!! error TS2322: Type 'Parent1<unknown>' is not assignable to type 'Parent1<string>'.
!!! error TS2322: Type 'unknown' is not assignable to type 'string'.
// Repro from #44572 with aliased object types
type Parent2<A> = {
child: Child2<A>;
parent: Parent2<A>;
}
type Child2<A, B = unknown> = {
child: Child2<A>;
parent: Parent2<A>;
readonly a: A;
readonly b: B;
}
function fn2<A>(inp: Child2<A>) {
const a: Child2<unknown> = inp;
}
declare let pu2: Parent2<unknown>;
declare let ps2: Parent2<string>;
pu2 = ps2; // Ok
ps2 = pu2; // Error expected
~~~
!!! error TS2322: Type 'Parent2<unknown>' is not assignable to type 'Parent2<string>'.
!!! error TS2322: Type 'unknown' is not assignable to type 'string'.
// Simpler repro for same issue
interface Parent3<A> {
child: Child3<A[]>;
parent: Parent3<A>;
}
interface Child3<A> extends Parent3<A> {
readonly a: A;
}
declare let cu3: Child3<unknown>;
declare let cs3: Child3<string>;
cu3 = cs3; // Ok
cs3 = cu3; // Error expected
~~~
!!! error TS2322: Type 'Child3<unknown>' is not assignable to type 'Child3<string>'.
!!! error TS2322: Type 'unknown' is not assignable to type 'string'.
declare let pu3: Parent3<unknown>;
declare let ps3: Parent3<string>;
pu3 = ps3; // Ok
ps3 = pu3; // Error expected
~~~
!!! error TS2322: Type 'Parent3<unknown>' is not assignable to type 'Parent3<string>'.
!!! error TS2322: Type 'unknown' is not assignable to type 'string'.
@@ -0,0 +1,88 @@
//// [checkOrderDependenceGenericAssignability.ts]
// Repro from #44572 with interface types
interface Parent1<A> {
child: Child1<A>;
parent: Parent1<A>;
}
interface Child1<A, B = unknown> extends Parent1<A> {
readonly a: A;
readonly b: B;
}
function fn1<A>(inp: Child1<A>) {
const a: Child1<unknown> = inp;
}
declare let pu1: Parent1<unknown>;
declare let ps1: Parent1<string>;
pu1 = ps1; // Ok
ps1 = pu1; // Error expected
// Repro from #44572 with aliased object types
type Parent2<A> = {
child: Child2<A>;
parent: Parent2<A>;
}
type Child2<A, B = unknown> = {
child: Child2<A>;
parent: Parent2<A>;
readonly a: A;
readonly b: B;
}
function fn2<A>(inp: Child2<A>) {
const a: Child2<unknown> = inp;
}
declare let pu2: Parent2<unknown>;
declare let ps2: Parent2<string>;
pu2 = ps2; // Ok
ps2 = pu2; // Error expected
// Simpler repro for same issue
interface Parent3<A> {
child: Child3<A[]>;
parent: Parent3<A>;
}
interface Child3<A> extends Parent3<A> {
readonly a: A;
}
declare let cu3: Child3<unknown>;
declare let cs3: Child3<string>;
cu3 = cs3; // Ok
cs3 = cu3; // Error expected
declare let pu3: Parent3<unknown>;
declare let ps3: Parent3<string>;
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
@@ -0,0 +1,193 @@
=== tests/cases/compiler/checkOrderDependenceGenericAssignability.ts ===
// Repro from #44572 with interface types
interface Parent1<A> {
>Parent1 : Symbol(Parent1, Decl(checkOrderDependenceGenericAssignability.ts, 0, 0))
>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 2, 18))
child: Child1<A>;
>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<A>;
>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<A, B = unknown> extends Parent1<A> {
>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<A>(inp: Child1<A>) {
>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<unknown> = 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<unknown>;
>pu1 : Symbol(pu1, Decl(checkOrderDependenceGenericAssignability.ts, 16, 11))
>Parent1 : Symbol(Parent1, Decl(checkOrderDependenceGenericAssignability.ts, 0, 0))
declare let ps1: Parent1<string>;
>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<A> = {
>Parent2 : Symbol(Parent2, Decl(checkOrderDependenceGenericAssignability.ts, 20, 10))
>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 24, 13))
child: Child2<A>;
>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<A>;
>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<A, B = unknown> = {
>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<A>;
>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<A>;
>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<A>(inp: Child2<A>) {
>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<unknown> = 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<unknown>;
>pu2 : Symbol(pu2, Decl(checkOrderDependenceGenericAssignability.ts, 40, 11))
>Parent2 : Symbol(Parent2, Decl(checkOrderDependenceGenericAssignability.ts, 20, 10))
declare let ps2: Parent2<string>;
>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<A> {
>Parent3 : Symbol(Parent3, Decl(checkOrderDependenceGenericAssignability.ts, 44, 10))
>A : Symbol(A, Decl(checkOrderDependenceGenericAssignability.ts, 48, 18))
child: Child3<A[]>;
>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<A>;
>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<A> extends Parent3<A> {
>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<unknown>;
>cu3 : Symbol(cu3, Decl(checkOrderDependenceGenericAssignability.ts, 57, 11))
>Child3 : Symbol(Child3, Decl(checkOrderDependenceGenericAssignability.ts, 51, 1))
declare let cs3: Child3<string>;
>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<unknown>;
>pu3 : Symbol(pu3, Decl(checkOrderDependenceGenericAssignability.ts, 63, 11))
>Parent3 : Symbol(Parent3, Decl(checkOrderDependenceGenericAssignability.ts, 44, 10))
declare let ps3: Parent3<string>;
>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))
@@ -0,0 +1,144 @@
=== tests/cases/compiler/checkOrderDependenceGenericAssignability.ts ===
// Repro from #44572 with interface types
interface Parent1<A> {
child: Child1<A>;
>child : Child1<A, unknown>
parent: Parent1<A>;
>parent : Parent1<A>
}
interface Child1<A, B = unknown> extends Parent1<A> {
readonly a: A;
>a : A
readonly b: B;
>b : B
}
function fn1<A>(inp: Child1<A>) {
>fn1 : <A>(inp: Child1<A>) => void
>inp : Child1<A, unknown>
const a: Child1<unknown> = inp;
>a : Child1<unknown, unknown>
>inp : Child1<A, unknown>
}
declare let pu1: Parent1<unknown>;
>pu1 : Parent1<unknown>
declare let ps1: Parent1<string>;
>ps1 : Parent1<string>
pu1 = ps1; // Ok
>pu1 = ps1 : Parent1<string>
>pu1 : Parent1<unknown>
>ps1 : Parent1<string>
ps1 = pu1; // Error expected
>ps1 = pu1 : Parent1<unknown>
>ps1 : Parent1<string>
>pu1 : Parent1<unknown>
// Repro from #44572 with aliased object types
type Parent2<A> = {
>Parent2 : Parent2<A>
child: Child2<A>;
>child : Child2<A, unknown>
parent: Parent2<A>;
>parent : Parent2<A>
}
type Child2<A, B = unknown> = {
>Child2 : Child2<A, B>
child: Child2<A>;
>child : Child2<A, unknown>
parent: Parent2<A>;
>parent : Parent2<A>
readonly a: A;
>a : A
readonly b: B;
>b : B
}
function fn2<A>(inp: Child2<A>) {
>fn2 : <A>(inp: Child2<A>) => void
>inp : Child2<A, unknown>
const a: Child2<unknown> = inp;
>a : Child2<unknown, unknown>
>inp : Child2<A, unknown>
}
declare let pu2: Parent2<unknown>;
>pu2 : Parent2<unknown>
declare let ps2: Parent2<string>;
>ps2 : Parent2<string>
pu2 = ps2; // Ok
>pu2 = ps2 : Parent2<string>
>pu2 : Parent2<unknown>
>ps2 : Parent2<string>
ps2 = pu2; // Error expected
>ps2 = pu2 : Parent2<unknown>
>ps2 : Parent2<string>
>pu2 : Parent2<unknown>
// Simpler repro for same issue
interface Parent3<A> {
child: Child3<A[]>;
>child : Child3<A[]>
parent: Parent3<A>;
>parent : Parent3<A>
}
interface Child3<A> extends Parent3<A> {
readonly a: A;
>a : A
}
declare let cu3: Child3<unknown>;
>cu3 : Child3<unknown>
declare let cs3: Child3<string>;
>cs3 : Child3<string>
cu3 = cs3; // Ok
>cu3 = cs3 : Child3<string>
>cu3 : Child3<unknown>
>cs3 : Child3<string>
cs3 = cu3; // Error expected
>cs3 = cu3 : Child3<unknown>
>cs3 : Child3<string>
>cu3 : Child3<unknown>
declare let pu3: Parent3<unknown>;
>pu3 : Parent3<unknown>
declare let ps3: Parent3<string>;
>ps3 : Parent3<string>
pu3 = ps3; // Ok
>pu3 = ps3 : Parent3<string>
>pu3 : Parent3<unknown>
>ps3 : Parent3<string>
ps3 = pu3; // Error expected
>ps3 = pu3 : Parent3<unknown>
>ps3 : Parent3<string>
>pu3 : Parent3<unknown>
@@ -0,0 +1,70 @@
// @strict: true
// Repro from #44572 with interface types
interface Parent1<A> {
child: Child1<A>;
parent: Parent1<A>;
}
interface Child1<A, B = unknown> extends Parent1<A> {
readonly a: A;
readonly b: B;
}
function fn1<A>(inp: Child1<A>) {
const a: Child1<unknown> = inp;
}
declare let pu1: Parent1<unknown>;
declare let ps1: Parent1<string>;
pu1 = ps1; // Ok
ps1 = pu1; // Error expected
// Repro from #44572 with aliased object types
type Parent2<A> = {
child: Child2<A>;
parent: Parent2<A>;
}
type Child2<A, B = unknown> = {
child: Child2<A>;
parent: Parent2<A>;
readonly a: A;
readonly b: B;
}
function fn2<A>(inp: Child2<A>) {
const a: Child2<unknown> = inp;
}
declare let pu2: Parent2<unknown>;
declare let ps2: Parent2<string>;
pu2 = ps2; // Ok
ps2 = pu2; // Error expected
// Simpler repro for same issue
interface Parent3<A> {
child: Child3<A[]>;
parent: Parent3<A>;
}
interface Child3<A> extends Parent3<A> {
readonly a: A;
}
declare let cu3: Child3<unknown>;
declare let cs3: Child3<string>;
cu3 = cs3; // Ok
cs3 = cu3; // Error expected
declare let pu3: Parent3<unknown>;
declare let ps3: Parent3<string>;
pu3 = ps3; // Ok
ps3 = pu3; // Error expected