Skip to content

Commit 67023a8

Browse files
Merge pull request #1827 from Microsoft/addJasonsExampleForContextuallyTypingArgumentsInSuperCalls
Added test for contextually typing parameters in super calls.
2 parents 26929ee + e4d3051 commit 67023a8

File tree

3 files changed

+171
-0
lines changed

3 files changed

+171
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//// [superCallParameterContextualTyping3.ts]
2+
interface ContextualType<T> {
3+
method(parameter: T): void;
4+
}
5+
6+
class CBase<T> {
7+
constructor(param: ContextualType<T>) {
8+
}
9+
10+
foo(param: ContextualType<T>) {
11+
}
12+
}
13+
14+
class C extends CBase<string> {
15+
constructor() {
16+
// Should be okay.
17+
// 'p' should have type 'string'.
18+
super({
19+
method(p) {
20+
p.length;
21+
}
22+
});
23+
24+
// Should be okay.
25+
// 'p' should have type 'string'.
26+
super.foo({
27+
method(p) {
28+
p.length;
29+
}
30+
});
31+
}
32+
}
33+
34+
//// [superCallParameterContextualTyping3.js]
35+
var __extends = this.__extends || function (d, b) {
36+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
37+
function __() { this.constructor = d; }
38+
__.prototype = b.prototype;
39+
d.prototype = new __();
40+
};
41+
var CBase = (function () {
42+
function CBase(param) {
43+
}
44+
CBase.prototype.foo = function (param) {
45+
};
46+
return CBase;
47+
})();
48+
var C = (function (_super) {
49+
__extends(C, _super);
50+
function C() {
51+
// Should be okay.
52+
// 'p' should have type 'string'.
53+
_super.call(this, {
54+
method: function (p) {
55+
p.length;
56+
}
57+
});
58+
// Should be okay.
59+
// 'p' should have type 'string'.
60+
_super.prototype.foo.call(this, {
61+
method: function (p) {
62+
p.length;
63+
}
64+
});
65+
}
66+
return C;
67+
})(CBase);
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
=== tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts ===
2+
interface ContextualType<T> {
3+
>ContextualType : ContextualType<T>
4+
>T : T
5+
6+
method(parameter: T): void;
7+
>method : (parameter: T) => void
8+
>parameter : T
9+
>T : T
10+
}
11+
12+
class CBase<T> {
13+
>CBase : CBase<T>
14+
>T : T
15+
16+
constructor(param: ContextualType<T>) {
17+
>param : ContextualType<T>
18+
>ContextualType : ContextualType<T>
19+
>T : T
20+
}
21+
22+
foo(param: ContextualType<T>) {
23+
>foo : (param: ContextualType<T>) => void
24+
>param : ContextualType<T>
25+
>ContextualType : ContextualType<T>
26+
>T : T
27+
}
28+
}
29+
30+
class C extends CBase<string> {
31+
>C : C
32+
>CBase : CBase<T>
33+
34+
constructor() {
35+
// Should be okay.
36+
// 'p' should have type 'string'.
37+
super({
38+
>super({ method(p) { p.length; } }) : void
39+
>super : typeof CBase
40+
>{ method(p) { p.length; } } : { method(p: string): void; }
41+
42+
method(p) {
43+
>method : (p: string) => void
44+
>p : string
45+
46+
p.length;
47+
>p.length : number
48+
>p : string
49+
>length : number
50+
}
51+
});
52+
53+
// Should be okay.
54+
// 'p' should have type 'string'.
55+
super.foo({
56+
>super.foo({ method(p) { p.length; } }) : void
57+
>super.foo : (param: ContextualType<string>) => void
58+
>super : CBase<string>
59+
>foo : (param: ContextualType<string>) => void
60+
>{ method(p) { p.length; } } : { method(p: string): void; }
61+
62+
method(p) {
63+
>method : (p: string) => void
64+
>p : string
65+
66+
p.length;
67+
>p.length : number
68+
>p : string
69+
>length : number
70+
}
71+
});
72+
}
73+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
interface ContextualType<T> {
2+
method(parameter: T): void;
3+
}
4+
5+
class CBase<T> {
6+
constructor(param: ContextualType<T>) {
7+
}
8+
9+
foo(param: ContextualType<T>) {
10+
}
11+
}
12+
13+
class C extends CBase<string> {
14+
constructor() {
15+
// Should be okay.
16+
// 'p' should have type 'string'.
17+
super({
18+
method(p) {
19+
p.length;
20+
}
21+
});
22+
23+
// Should be okay.
24+
// 'p' should have type 'string'.
25+
super.foo({
26+
method(p) {
27+
p.length;
28+
}
29+
});
30+
}
31+
}

0 commit comments

Comments
 (0)