Skip to content

Commit 1beb385

Browse files
committed
Test cases for new proposed feature
1 parent b4e0ba9 commit 1beb385

5 files changed

+176
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// @strictInstanceOfTypeParameters: true
2+
3+
class Unconstrained<T> {
4+
value: T;
5+
read: (value: T) => void;
6+
}
7+
8+
declare const x: unknown;
9+
10+
if (x instanceof Unconstrained) {
11+
x.value.toUpperCase();
12+
x.value++;
13+
x.value();
14+
15+
if (typeof x.value === "string") {
16+
x.value.toUpperCase();
17+
}
18+
if (typeof x.value === "number") {
19+
x.value++;
20+
}
21+
22+
x.read(1);
23+
x.read("foo");
24+
}
25+
26+
class Constrained<T extends number> {
27+
value: T;
28+
read: (value: T) => void;
29+
}
30+
31+
declare const y: unknown;
32+
33+
if (y instanceof Constrained) {
34+
y.value++;
35+
36+
y.read(1);
37+
y.read("foo");
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @strictInstanceOfTypeParameters: true
2+
3+
function MakeClass<T>(someStuff: T) {
4+
return class {
5+
someStuff = someStuff;
6+
};
7+
}
8+
9+
const MadeClassNumber = MakeClass(123);
10+
const MadeClassString = MakeClass("foo");
11+
12+
const numberInstance = new MadeClassNumber();
13+
numberInstance.someStuff;
14+
15+
declare const someInstance: unknown;
16+
if (someInstance instanceof MadeClassNumber) {
17+
someInstance.someStuff;
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// @strictInstanceOfTypeParameters: true
2+
// @target: es2015
3+
4+
class UnconstrainedWithPrivate<T> {
5+
#brand;
6+
value: T;
7+
constructor(value: T) {
8+
this.value = value;
9+
}
10+
copyValue(other: object) {
11+
if (#brand in other) {
12+
this.value = other.value;
13+
}
14+
}
15+
}
16+
17+
class ConstrainedWithPrivate<T extends string> {
18+
#brand;
19+
value: T;
20+
copyValue(other: object) {
21+
if (#brand in other) {
22+
this.value = other.value;
23+
}
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @strictInstanceOfTypeParameters: true
2+
3+
class Box<T> {
4+
value: T;
5+
}
6+
7+
class BoxBox<T, B extends Box<T>> {
8+
box: B;
9+
}
10+
11+
declare const bb: any;
12+
if (bb instanceof BoxBox) {
13+
bb.box.value;
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// @strictInstanceOfTypeParameters: true
2+
3+
class UnconstrainedCovariant<out T> {
4+
x: T;
5+
}
6+
7+
declare const unc_covariant: unknown;
8+
9+
if (unc_covariant instanceof UnconstrainedCovariant) {
10+
let unknown_covariant: UnconstrainedCovariant<unknown> = unc_covariant;
11+
let never_covariant: UnconstrainedCovariant<never> = unc_covariant; // Error
12+
let any_covariant: UnconstrainedCovariant<any> = unc_covariant;
13+
let sub_covariant: UnconstrainedCovariant<"literal"> = unc_covariant; // Error
14+
}
15+
16+
class ConstrainedCovariant<out T extends string> {
17+
x: T;
18+
}
19+
20+
declare const con_covariant: unknown;
21+
22+
if (con_covariant instanceof ConstrainedCovariant) {
23+
let never_covariant: ConstrainedCovariant<never> = con_covariant; // Error
24+
let any_covariant: ConstrainedCovariant<any> = con_covariant;
25+
let constraint_covariant: ConstrainedCovariant<string> = con_covariant;
26+
let sub_covariant: ConstrainedCovariant<"literal"> = con_covariant; // Error
27+
}
28+
29+
class UnconstrainedContravariant<in T> {
30+
f: (x: T) => void;
31+
}
32+
33+
declare const unc_contravariant: unknown;
34+
35+
if (unc_contravariant instanceof UnconstrainedContravariant) {
36+
let unknown_covariant: UnconstrainedContravariant<unknown> = unc_contravariant; // Error
37+
let never_covariant: UnconstrainedContravariant<never> = unc_contravariant;
38+
let any_covariant: UnconstrainedContravariant<any> = unc_contravariant; // Error
39+
let constraint_covariant: UnconstrainedContravariant<string> = unc_contravariant; // Error
40+
let sub_covariant: UnconstrainedContravariant<"literal"> = unc_contravariant; // Error
41+
}
42+
43+
class ConstrainedContravariant<in T extends string> {
44+
f: (x: T) => void;
45+
}
46+
47+
declare const con_contravariant: unknown;
48+
49+
if (con_contravariant instanceof ConstrainedContravariant) {
50+
let never_covariant: ConstrainedContravariant<never> = con_contravariant;
51+
let any_covariant: ConstrainedContravariant<any> = con_contravariant; // Error
52+
let constraint_covariant: ConstrainedContravariant<string> = con_contravariant; // Error
53+
let sub_covariant: ConstrainedContravariant<"literal"> = con_contravariant; // Error
54+
}
55+
56+
class UnconstrainedInvariant<in out T> {
57+
f: (x: T) => T;
58+
}
59+
60+
declare const unc_invariant: unknown;
61+
62+
if (unc_invariant instanceof UnconstrainedInvariant) {
63+
let unknown_covariant: UnconstrainedInvariant<unknown> = unc_invariant;
64+
let never_covariant: UnconstrainedInvariant<never> = unc_invariant; // Error
65+
let any_covariant: UnconstrainedInvariant<any> = unc_invariant;
66+
let constraint_covariant: UnconstrainedInvariant<string> = unc_invariant; // Error
67+
let sub_covariant: UnconstrainedInvariant<"literal"> = unc_invariant; // Error
68+
}
69+
70+
class ConstrainedInvariant<in out T extends string> {
71+
f: (x: T) => T;
72+
}
73+
74+
declare const con_invariant: unknown;
75+
76+
if (con_invariant instanceof ConstrainedInvariant) {
77+
let never_covariant: ConstrainedInvariant<never> = con_invariant; // Error
78+
let any_covariant: ConstrainedInvariant<any> = con_invariant;
79+
let constraint_covariant: ConstrainedInvariant<string> = con_invariant;
80+
let sub_covariant: ConstrainedInvariant<"literal"> = con_invariant; // Error
81+
}

0 commit comments

Comments
 (0)