mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-15 11:35:42 -06:00
Improve error reporting
1. Fix bug in error reporting in compareSignaturesRelated. 2. When the this-argument is a union type, allow assignability when the method's signature is assignable to *any* member of the union.
This commit is contained in:
parent
fa598758b1
commit
738713b146
@ -5305,7 +5305,9 @@ namespace ts {
|
||||
if (!related) {
|
||||
related = compareTypes(source.thisType, target.thisType, /*reportErrors*/ false);
|
||||
if (!related) {
|
||||
errorReporter(Diagnostics.Types_of_parameters_0_and_1_are_incompatible, "this", "this");
|
||||
if (reportErrors) {
|
||||
errorReporter(Diagnostics.Types_of_parameters_0_and_1_are_incompatible, "this", "this");
|
||||
}
|
||||
return Ternary.False;
|
||||
}
|
||||
}
|
||||
@ -9511,7 +9513,13 @@ namespace ts {
|
||||
const thisArgumentNode = getThisArgumentOfCall(node);
|
||||
const thisArgumentType = thisArgumentNode ? checkExpression(thisArgumentNode) : voidType;
|
||||
const errorNode = reportErrors ? (thisArgumentNode || node) : undefined;
|
||||
if (!checkTypeRelatedTo(thisArgumentType, signature.thisType, relation, errorNode, headMessage)) {
|
||||
if (thisArgumentType.flags & TypeFlags.UnionOrIntersection) {
|
||||
const u = <UnionType>thisArgumentType;
|
||||
if (!forEach(u.types, t => checkTypeRelatedTo(t, signature.thisType, relation, errorNode, headMessage))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (!checkTypeRelatedTo(thisArgumentType, signature.thisType, relation, errorNode, headMessage)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -91,6 +91,23 @@ namespace ts {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterates through `array` by index and performs the callback on each element of array until the callback
|
||||
* returns a falsey value, then returns false.
|
||||
* If no such value is found, the callback is applied to each element of array and `true` is returned.
|
||||
*/
|
||||
export function trueForAll<T>(array: T[], callback: (element: T, index: number) => boolean): boolean {
|
||||
if (array) {
|
||||
for (let i = 0, len = array.length; i < len; i++) {
|
||||
if (!callback(array[i], i)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
export function contains<T>(array: T[], value: T): boolean {
|
||||
if (array) {
|
||||
for (const v of array) {
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
//// [thisTypeInFunctions.ts]
|
||||
// body checking
|
||||
class B {
|
||||
n: number;
|
||||
}
|
||||
class C {
|
||||
n: number;
|
||||
explicitThis(this: this, m: number): number {
|
||||
@ -19,9 +22,6 @@ class C {
|
||||
}
|
||||
}
|
||||
class D extends C { }
|
||||
class B {
|
||||
n: number;
|
||||
}
|
||||
interface I {
|
||||
a: number;
|
||||
explicitVoid1(this: void): number;
|
||||
@ -185,6 +185,11 @@ d2.implicit = d1.explicit // ok, 'y' in { x, y } (c assignable to f)
|
||||
b1.implicit = d2.implicit // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
b1.explicit = d2.implicit // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
|
||||
// union assignability
|
||||
|
||||
let b1b2: Base1 | Base2;
|
||||
b1b2.implicit();
|
||||
|
||||
////// use this-type for construction with new ////
|
||||
function InterfaceThis(this: I) {
|
||||
this.a = 12;
|
||||
@ -216,6 +221,11 @@ var __extends = (this && this.__extends) || function (d, b) {
|
||||
};
|
||||
var _this = this;
|
||||
// body checking
|
||||
var B = (function () {
|
||||
function B() {
|
||||
}
|
||||
return B;
|
||||
}());
|
||||
var C = (function () {
|
||||
function C() {
|
||||
}
|
||||
@ -243,11 +253,6 @@ var D = (function (_super) {
|
||||
}
|
||||
return D;
|
||||
}(C));
|
||||
var B = (function () {
|
||||
function B() {
|
||||
}
|
||||
return B;
|
||||
}());
|
||||
function explicitStructural(x) {
|
||||
return x + this.y;
|
||||
}
|
||||
@ -390,6 +395,9 @@ d1.implicit = b2.implicit; // ok, 'y' in D: { x, y } (d assignable e)
|
||||
d2.implicit = d1.explicit; // ok, 'y' in { x, y } (c assignable to f)
|
||||
b1.implicit = d2.implicit; // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
b1.explicit = d2.implicit; // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
// union assignability
|
||||
var b1b2;
|
||||
b1b2.implicit();
|
||||
////// use this-type for construction with new ////
|
||||
function InterfaceThis() {
|
||||
this.a = 12;
|
||||
|
||||
@ -1,77 +1,77 @@
|
||||
=== tests/cases/conformance/types/thisType/thisTypeInFunctions.ts ===
|
||||
// body checking
|
||||
class C {
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
class B {
|
||||
>B : Symbol(B, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
|
||||
n: number;
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
}
|
||||
class C {
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
|
||||
n: number;
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
|
||||
explicitThis(this: this, m: number): number {
|
||||
>explicitThis : Symbol(explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 3, 17))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 3, 28))
|
||||
>explicitThis : Symbol(explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 6, 17))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 6, 28))
|
||||
|
||||
return this.n + m;
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 3, 28))
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 6, 28))
|
||||
}
|
||||
implicitThis(m: number): number {
|
||||
>implicitThis : Symbol(implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 6, 17))
|
||||
>implicitThis : Symbol(implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 9, 17))
|
||||
|
||||
return this.n + m;
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 6, 17))
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 9, 17))
|
||||
}
|
||||
explicitC(this: C, m: number): number {
|
||||
>explicitC : Symbol(explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 9, 14))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 9, 22))
|
||||
>explicitC : Symbol(explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 12, 14))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 12, 22))
|
||||
|
||||
return this.n + m;
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 9, 22))
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 12, 22))
|
||||
}
|
||||
explicitProperty(this: {n: number}, m: number): number {
|
||||
>explicitProperty : Symbol(explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 12, 21))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 12, 28))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 12, 39))
|
||||
>explicitProperty : Symbol(explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 15, 21))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 15, 28))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 15, 39))
|
||||
|
||||
return this.n + m;
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 12, 28))
|
||||
>this : Symbol(, Decl(thisTypeInFunctions.ts, 12, 26))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 12, 28))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 12, 39))
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 15, 28))
|
||||
>this : Symbol(, Decl(thisTypeInFunctions.ts, 15, 26))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 15, 28))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 15, 39))
|
||||
}
|
||||
explicitVoid(this: void, m: number): number {
|
||||
>explicitVoid : Symbol(explicitVoid, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 15, 17))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 15, 28))
|
||||
>explicitVoid : Symbol(explicitVoid, Decl(thisTypeInFunctions.ts, 17, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 18, 17))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 18, 28))
|
||||
|
||||
return m + 1;
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 15, 28))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 18, 28))
|
||||
}
|
||||
}
|
||||
class D extends C { }
|
||||
>D : Symbol(D, Decl(thisTypeInFunctions.ts, 18, 1))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>D : Symbol(D, Decl(thisTypeInFunctions.ts, 21, 1))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
|
||||
class B {
|
||||
>B : Symbol(B, Decl(thisTypeInFunctions.ts, 19, 21))
|
||||
|
||||
n: number;
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 20, 9))
|
||||
}
|
||||
interface I {
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
|
||||
a: number;
|
||||
>a : Symbol(a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
@ -92,7 +92,7 @@ interface I {
|
||||
explicitInterface(this: I): number;
|
||||
>explicitInterface : Symbol(explicitInterface, Decl(thisTypeInFunctions.ts, 27, 50))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 28, 22))
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
|
||||
explicitThis(this: this): number;
|
||||
>explicitThis : Symbol(explicitThis, Decl(thisTypeInFunctions.ts, 28, 39))
|
||||
@ -134,7 +134,7 @@ function implicitThis(n: number): number {
|
||||
}
|
||||
let impl: I = {
|
||||
>impl : Symbol(impl, Decl(thisTypeInFunctions.ts, 42, 3))
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
|
||||
a: 12,
|
||||
>a : Symbol(a, Decl(thisTypeInFunctions.ts, 42, 15))
|
||||
@ -159,7 +159,7 @@ let impl: I = {
|
||||
|
||||
return this.a;
|
||||
>this.a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
>a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
|
||||
},
|
||||
@ -168,7 +168,7 @@ let impl: I = {
|
||||
|
||||
return this.a;
|
||||
>this.a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
>a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
|
||||
},
|
||||
@ -177,7 +177,7 @@ let impl: I = {
|
||||
|
||||
return this.a;
|
||||
>this.a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
>a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
|
||||
},
|
||||
@ -207,7 +207,7 @@ impl.explicitInterface = function() { return this.a; };
|
||||
>impl : Symbol(impl, Decl(thisTypeInFunctions.ts, 42, 3))
|
||||
>explicitInterface : Symbol(I.explicitInterface, Decl(thisTypeInFunctions.ts, 27, 50))
|
||||
>this.a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
>a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
|
||||
impl.explicitStructural = () => 12;
|
||||
@ -225,7 +225,7 @@ impl.explicitThis = function () { return this.a; };
|
||||
>impl : Symbol(impl, Decl(thisTypeInFunctions.ts, 42, 3))
|
||||
>explicitThis : Symbol(I.explicitThis, Decl(thisTypeInFunctions.ts, 28, 39))
|
||||
>this.a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
>a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
|
||||
impl.implicitMethod = function () { return this.a; };
|
||||
@ -233,7 +233,7 @@ impl.implicitMethod = function () { return this.a; };
|
||||
>impl : Symbol(impl, Decl(thisTypeInFunctions.ts, 42, 3))
|
||||
>implicitMethod : Symbol(I.implicitMethod, Decl(thisTypeInFunctions.ts, 29, 37))
|
||||
>this.a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
>a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
|
||||
impl.implicitMethod = () => 12;
|
||||
@ -282,57 +282,57 @@ implicitAnyOk.f(12);
|
||||
|
||||
let c = new C();
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
|
||||
let d = new D();
|
||||
>d : Symbol(d, Decl(thisTypeInFunctions.ts, 78, 3))
|
||||
>D : Symbol(D, Decl(thisTypeInFunctions.ts, 18, 1))
|
||||
>D : Symbol(D, Decl(thisTypeInFunctions.ts, 21, 1))
|
||||
|
||||
let ripped = c.explicitC;
|
||||
>ripped : Symbol(ripped, Decl(thisTypeInFunctions.ts, 79, 3))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
|
||||
c.explicitC(12);
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
|
||||
c.explicitProperty(12);
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
|
||||
c.explicitThis(12);
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
|
||||
c.implicitThis(12);
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
|
||||
d.explicitC(12);
|
||||
>d.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>d.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>d : Symbol(d, Decl(thisTypeInFunctions.ts, 78, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
|
||||
d.explicitProperty(12);
|
||||
>d.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>d.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>d : Symbol(d, Decl(thisTypeInFunctions.ts, 78, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
|
||||
d.explicitThis(12);
|
||||
>d.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>d.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>d : Symbol(d, Decl(thisTypeInFunctions.ts, 78, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
|
||||
d.implicitThis(12);
|
||||
>d.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>d.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>d : Symbol(d, Decl(thisTypeInFunctions.ts, 78, 3))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
|
||||
let reconstructed: {
|
||||
>reconstructed : Symbol(reconstructed, Decl(thisTypeInFunctions.ts, 88, 3))
|
||||
@ -343,7 +343,7 @@ let reconstructed: {
|
||||
explicitThis(this: C, m: number): number, // note: this: this is not allowed in an object literal type.
|
||||
>explicitThis : Symbol(explicitThis, Decl(thisTypeInFunctions.ts, 89, 14))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 90, 17))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 90, 25))
|
||||
|
||||
implicitThis(m: number): number,
|
||||
@ -353,7 +353,7 @@ let reconstructed: {
|
||||
explicitC(this: C, m: number): number,
|
||||
>explicitC : Symbol(explicitC, Decl(thisTypeInFunctions.ts, 91, 36))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 92, 14))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 92, 22))
|
||||
|
||||
explicitProperty: (this: {n : number}, m: number) => number,
|
||||
@ -373,33 +373,33 @@ let reconstructed: {
|
||||
|
||||
explicitThis: c.explicitThis,
|
||||
>explicitThis : Symbol(explicitThis, Decl(thisTypeInFunctions.ts, 96, 10))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
|
||||
implicitThis: c.implicitThis,
|
||||
>implicitThis : Symbol(implicitThis, Decl(thisTypeInFunctions.ts, 97, 33))
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
|
||||
explicitC: c.explicitC,
|
||||
>explicitC : Symbol(explicitC, Decl(thisTypeInFunctions.ts, 98, 33))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
|
||||
explicitProperty: c.explicitProperty,
|
||||
>explicitProperty : Symbol(explicitProperty, Decl(thisTypeInFunctions.ts, 99, 27))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
|
||||
explicitVoid: c.explicitVoid
|
||||
>explicitVoid : Symbol(explicitVoid, Decl(thisTypeInFunctions.ts, 100, 41))
|
||||
>c.explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c.explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 17, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 17, 5))
|
||||
|
||||
};
|
||||
reconstructed.explicitProperty(11);
|
||||
@ -467,7 +467,7 @@ let specifiedLambdaToSpecified: (this: {y: number}, x: number) => number = speci
|
||||
let explicitCFunction: (this: C, m: number) => number;
|
||||
>explicitCFunction : Symbol(explicitCFunction, Decl(thisTypeInFunctions.ts, 117, 3))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 117, 24))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 117, 32))
|
||||
|
||||
let explicitPropertyFunction: (this: {n: number}, m: number) => number;
|
||||
@ -477,33 +477,33 @@ let explicitPropertyFunction: (this: {n: number}, m: number) => number;
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 118, 49))
|
||||
|
||||
c.explicitC = explicitCFunction;
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitCFunction : Symbol(explicitCFunction, Decl(thisTypeInFunctions.ts, 117, 3))
|
||||
|
||||
c.explicitC = function(this: C, m: number) { return this.n + m };
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 120, 23))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 120, 31))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 120, 31))
|
||||
|
||||
c.explicitProperty = explicitPropertyFunction;
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>explicitPropertyFunction : Symbol(explicitPropertyFunction, Decl(thisTypeInFunctions.ts, 118, 3))
|
||||
|
||||
c.explicitProperty = function(this: {n: number}, m: number) { return this.n + m };
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 122, 30))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 122, 37))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 122, 48))
|
||||
@ -513,143 +513,143 @@ c.explicitProperty = function(this: {n: number}, m: number) { return this.n + m
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 122, 48))
|
||||
|
||||
c.explicitProperty = reconstructed.explicitProperty;
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>reconstructed.explicitProperty : Symbol(explicitProperty, Decl(thisTypeInFunctions.ts, 92, 42))
|
||||
>reconstructed : Symbol(reconstructed, Decl(thisTypeInFunctions.ts, 88, 3))
|
||||
>explicitProperty : Symbol(explicitProperty, Decl(thisTypeInFunctions.ts, 92, 42))
|
||||
|
||||
// lambdas are assignable to anything
|
||||
c.explicitC = m => m;
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 126, 13))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 126, 13))
|
||||
|
||||
c.explicitThis = m => m;
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 127, 16))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 127, 16))
|
||||
|
||||
c.explicitProperty = m => m;
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 128, 20))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 128, 20))
|
||||
|
||||
// this inside lambdas refer to outer scope
|
||||
// the outer-scoped lambda at top-level is still just `any`
|
||||
c.explicitC = m => m + this.n;
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 132, 13))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 132, 13))
|
||||
|
||||
c.explicitThis = m => m + this.n;
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 133, 16))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 133, 16))
|
||||
|
||||
c.explicitProperty = m => m + this.n;
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 134, 20))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 134, 20))
|
||||
|
||||
//NOTE: this=C here, I guess?
|
||||
c.explicitThis = explicitCFunction;
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>explicitCFunction : Symbol(explicitCFunction, Decl(thisTypeInFunctions.ts, 117, 3))
|
||||
|
||||
c.explicitThis = function(this: C, m: number) { return this.n + m };
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 138, 26))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>C : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 138, 34))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 138, 34))
|
||||
|
||||
// this:any compatibility
|
||||
c.explicitC = function(m) { return this.n + m };
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 141, 23))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 141, 23))
|
||||
|
||||
c.explicitProperty = function(m) { return this.n + m };
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c.explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>explicitProperty : Symbol(C.explicitProperty, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 142, 30))
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 12, 28))
|
||||
>this : Symbol(, Decl(thisTypeInFunctions.ts, 12, 26))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 12, 28))
|
||||
>this.n : Symbol(n, Decl(thisTypeInFunctions.ts, 15, 28))
|
||||
>this : Symbol(, Decl(thisTypeInFunctions.ts, 15, 26))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 15, 28))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 142, 30))
|
||||
|
||||
c.explicitThis = function(m) { return this.n + m };
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>c.explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 2, 14))
|
||||
>explicitThis : Symbol(C.explicitThis, Decl(thisTypeInFunctions.ts, 5, 14))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 143, 26))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 143, 26))
|
||||
|
||||
c.implicitThis = function(m) { return this.n + m };
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 144, 26))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this.n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>this : Symbol(C, Decl(thisTypeInFunctions.ts, 3, 1))
|
||||
>n : Symbol(C.n, Decl(thisTypeInFunctions.ts, 4, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 144, 26))
|
||||
|
||||
c.implicitThis = reconstructed.implicitThis;
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>c.implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 5, 5))
|
||||
>implicitThis : Symbol(C.implicitThis, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>reconstructed.implicitThis : Symbol(implicitThis, Decl(thisTypeInFunctions.ts, 90, 45))
|
||||
>reconstructed : Symbol(reconstructed, Decl(thisTypeInFunctions.ts, 88, 3))
|
||||
>implicitThis : Symbol(implicitThis, Decl(thisTypeInFunctions.ts, 90, 45))
|
||||
|
||||
c.explicitC = function(this: B, m: number) { return this.n + m };
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>c.explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 8, 5))
|
||||
>explicitC : Symbol(C.explicitC, Decl(thisTypeInFunctions.ts, 11, 5))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 147, 23))
|
||||
>B : Symbol(B, Decl(thisTypeInFunctions.ts, 19, 21))
|
||||
>B : Symbol(B, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 147, 31))
|
||||
>this.n : Symbol(B.n, Decl(thisTypeInFunctions.ts, 20, 9))
|
||||
>this : Symbol(B, Decl(thisTypeInFunctions.ts, 19, 21))
|
||||
>n : Symbol(B.n, Decl(thisTypeInFunctions.ts, 20, 9))
|
||||
>this.n : Symbol(B.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>this : Symbol(B, Decl(thisTypeInFunctions.ts, 0, 0))
|
||||
>n : Symbol(B.n, Decl(thisTypeInFunctions.ts, 1, 9))
|
||||
>m : Symbol(m, Decl(thisTypeInFunctions.ts, 147, 31))
|
||||
|
||||
// this:void compatibility
|
||||
c.explicitVoid = n => n;
|
||||
>c.explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>c.explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 17, 5))
|
||||
>c : Symbol(c, Decl(thisTypeInFunctions.ts, 77, 3))
|
||||
>explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 14, 5))
|
||||
>explicitVoid : Symbol(C.explicitVoid, Decl(thisTypeInFunctions.ts, 17, 5))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 150, 16))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 150, 16))
|
||||
|
||||
@ -791,72 +791,84 @@ b1.explicit = d2.implicit // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
>d2 : Symbol(d2, Decl(thisTypeInFunctions.ts, 176, 3))
|
||||
>implicit : Symbol(Base2.implicit, Decl(thisTypeInFunctions.ts, 166, 13))
|
||||
|
||||
// union assignability
|
||||
|
||||
let b1b2: Base1 | Base2;
|
||||
>b1b2 : Symbol(b1b2, Decl(thisTypeInFunctions.ts, 188, 3))
|
||||
>Base1 : Symbol(Base1, Decl(thisTypeInFunctions.ts, 150, 24))
|
||||
>Base2 : Symbol(Base2, Decl(thisTypeInFunctions.ts, 164, 1))
|
||||
|
||||
b1b2.implicit();
|
||||
>b1b2.implicit : Symbol(implicit, Decl(thisTypeInFunctions.ts, 154, 14), Decl(thisTypeInFunctions.ts, 166, 13))
|
||||
>b1b2 : Symbol(b1b2, Decl(thisTypeInFunctions.ts, 188, 3))
|
||||
>implicit : Symbol(implicit, Decl(thisTypeInFunctions.ts, 154, 14), Decl(thisTypeInFunctions.ts, 166, 13))
|
||||
|
||||
////// use this-type for construction with new ////
|
||||
function InterfaceThis(this: I) {
|
||||
>InterfaceThis : Symbol(InterfaceThis, Decl(thisTypeInFunctions.ts, 184, 25))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 187, 23))
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>InterfaceThis : Symbol(InterfaceThis, Decl(thisTypeInFunctions.ts, 189, 16))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 192, 23))
|
||||
>I : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
|
||||
this.a = 12;
|
||||
>this.a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 1))
|
||||
>this : Symbol(I, Decl(thisTypeInFunctions.ts, 22, 21))
|
||||
>a : Symbol(I.a, Decl(thisTypeInFunctions.ts, 23, 13))
|
||||
}
|
||||
function LiteralTypeThis(this: {x: string}) {
|
||||
>LiteralTypeThis : Symbol(LiteralTypeThis, Decl(thisTypeInFunctions.ts, 189, 1))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 190, 25))
|
||||
>x : Symbol(x, Decl(thisTypeInFunctions.ts, 190, 32))
|
||||
>LiteralTypeThis : Symbol(LiteralTypeThis, Decl(thisTypeInFunctions.ts, 194, 1))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 195, 25))
|
||||
>x : Symbol(x, Decl(thisTypeInFunctions.ts, 195, 32))
|
||||
|
||||
this.x = "ok";
|
||||
>this.x : Symbol(x, Decl(thisTypeInFunctions.ts, 190, 32))
|
||||
>this : Symbol(, Decl(thisTypeInFunctions.ts, 190, 30))
|
||||
>x : Symbol(x, Decl(thisTypeInFunctions.ts, 190, 32))
|
||||
>this.x : Symbol(x, Decl(thisTypeInFunctions.ts, 195, 32))
|
||||
>this : Symbol(, Decl(thisTypeInFunctions.ts, 195, 30))
|
||||
>x : Symbol(x, Decl(thisTypeInFunctions.ts, 195, 32))
|
||||
}
|
||||
function AnyThis(this: any) {
|
||||
>AnyThis : Symbol(AnyThis, Decl(thisTypeInFunctions.ts, 192, 1))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 193, 17))
|
||||
>AnyThis : Symbol(AnyThis, Decl(thisTypeInFunctions.ts, 197, 1))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 198, 17))
|
||||
|
||||
this.x = "ok";
|
||||
}
|
||||
let interfaceThis = new InterfaceThis();
|
||||
>interfaceThis : Symbol(interfaceThis, Decl(thisTypeInFunctions.ts, 196, 3))
|
||||
>InterfaceThis : Symbol(InterfaceThis, Decl(thisTypeInFunctions.ts, 184, 25))
|
||||
>interfaceThis : Symbol(interfaceThis, Decl(thisTypeInFunctions.ts, 201, 3))
|
||||
>InterfaceThis : Symbol(InterfaceThis, Decl(thisTypeInFunctions.ts, 189, 16))
|
||||
|
||||
let literalTypeThis = new LiteralTypeThis();
|
||||
>literalTypeThis : Symbol(literalTypeThis, Decl(thisTypeInFunctions.ts, 197, 3))
|
||||
>LiteralTypeThis : Symbol(LiteralTypeThis, Decl(thisTypeInFunctions.ts, 189, 1))
|
||||
>literalTypeThis : Symbol(literalTypeThis, Decl(thisTypeInFunctions.ts, 202, 3))
|
||||
>LiteralTypeThis : Symbol(LiteralTypeThis, Decl(thisTypeInFunctions.ts, 194, 1))
|
||||
|
||||
let anyThis = new AnyThis();
|
||||
>anyThis : Symbol(anyThis, Decl(thisTypeInFunctions.ts, 198, 3))
|
||||
>AnyThis : Symbol(AnyThis, Decl(thisTypeInFunctions.ts, 192, 1))
|
||||
>anyThis : Symbol(anyThis, Decl(thisTypeInFunctions.ts, 203, 3))
|
||||
>AnyThis : Symbol(AnyThis, Decl(thisTypeInFunctions.ts, 197, 1))
|
||||
|
||||
//// type parameter inference ////
|
||||
declare var f: {
|
||||
>f : Symbol(f, Decl(thisTypeInFunctions.ts, 201, 11))
|
||||
>f : Symbol(f, Decl(thisTypeInFunctions.ts, 206, 11))
|
||||
|
||||
(this: void, x: number): number,
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 202, 5))
|
||||
>x : Symbol(x, Decl(thisTypeInFunctions.ts, 202, 16))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 207, 5))
|
||||
>x : Symbol(x, Decl(thisTypeInFunctions.ts, 207, 16))
|
||||
|
||||
call<U>(this: (...argArray: any[]) => U, ...argArray: any[]): U;
|
||||
>call : Symbol(call, Decl(thisTypeInFunctions.ts, 202, 36))
|
||||
>U : Symbol(U, Decl(thisTypeInFunctions.ts, 203, 9))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 203, 12))
|
||||
>argArray : Symbol(argArray, Decl(thisTypeInFunctions.ts, 203, 19))
|
||||
>U : Symbol(U, Decl(thisTypeInFunctions.ts, 203, 9))
|
||||
>argArray : Symbol(argArray, Decl(thisTypeInFunctions.ts, 203, 44))
|
||||
>U : Symbol(U, Decl(thisTypeInFunctions.ts, 203, 9))
|
||||
>call : Symbol(call, Decl(thisTypeInFunctions.ts, 207, 36))
|
||||
>U : Symbol(U, Decl(thisTypeInFunctions.ts, 208, 9))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 208, 12))
|
||||
>argArray : Symbol(argArray, Decl(thisTypeInFunctions.ts, 208, 19))
|
||||
>U : Symbol(U, Decl(thisTypeInFunctions.ts, 208, 9))
|
||||
>argArray : Symbol(argArray, Decl(thisTypeInFunctions.ts, 208, 44))
|
||||
>U : Symbol(U, Decl(thisTypeInFunctions.ts, 208, 9))
|
||||
|
||||
};
|
||||
let n: number = f.call(12);
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 205, 3))
|
||||
>f.call : Symbol(call, Decl(thisTypeInFunctions.ts, 202, 36))
|
||||
>f : Symbol(f, Decl(thisTypeInFunctions.ts, 201, 11))
|
||||
>call : Symbol(call, Decl(thisTypeInFunctions.ts, 202, 36))
|
||||
>n : Symbol(n, Decl(thisTypeInFunctions.ts, 210, 3))
|
||||
>f.call : Symbol(call, Decl(thisTypeInFunctions.ts, 207, 36))
|
||||
>f : Symbol(f, Decl(thisTypeInFunctions.ts, 206, 11))
|
||||
>call : Symbol(call, Decl(thisTypeInFunctions.ts, 207, 36))
|
||||
|
||||
function missingTypeIsImplicitAny(this, a: number) { return a; }
|
||||
>missingTypeIsImplicitAny : Symbol(missingTypeIsImplicitAny, Decl(thisTypeInFunctions.ts, 205, 27))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 207, 34))
|
||||
>a : Symbol(a, Decl(thisTypeInFunctions.ts, 207, 39))
|
||||
>a : Symbol(a, Decl(thisTypeInFunctions.ts, 207, 39))
|
||||
>missingTypeIsImplicitAny : Symbol(missingTypeIsImplicitAny, Decl(thisTypeInFunctions.ts, 210, 27))
|
||||
>this : Symbol(this, Decl(thisTypeInFunctions.ts, 212, 34))
|
||||
>a : Symbol(a, Decl(thisTypeInFunctions.ts, 212, 39))
|
||||
>a : Symbol(a, Decl(thisTypeInFunctions.ts, 212, 39))
|
||||
|
||||
|
||||
@ -1,5 +1,11 @@
|
||||
=== tests/cases/conformance/types/thisType/thisTypeInFunctions.ts ===
|
||||
// body checking
|
||||
class B {
|
||||
>B : B
|
||||
|
||||
n: number;
|
||||
>n : number
|
||||
}
|
||||
class C {
|
||||
>C : C
|
||||
|
||||
@ -70,12 +76,6 @@ class D extends C { }
|
||||
>D : D
|
||||
>C : C
|
||||
|
||||
class B {
|
||||
>B : B
|
||||
|
||||
n: number;
|
||||
>n : number
|
||||
}
|
||||
interface I {
|
||||
>I : I
|
||||
|
||||
@ -952,6 +952,19 @@ b1.explicit = d2.implicit // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
>d2 : Derived2
|
||||
>implicit : (this: Derived2) => number
|
||||
|
||||
// union assignability
|
||||
|
||||
let b1b2: Base1 | Base2;
|
||||
>b1b2 : Base1 | Base2
|
||||
>Base1 : Base1
|
||||
>Base2 : Base2
|
||||
|
||||
b1b2.implicit();
|
||||
>b1b2.implicit() : number
|
||||
>b1b2.implicit : ((this: Base1) => number) | ((this: Base2) => number)
|
||||
>b1b2 : Base1 | Base2
|
||||
>implicit : ((this: Base1) => number) | ((this: Base2) => number)
|
||||
|
||||
////// use this-type for construction with new ////
|
||||
function InterfaceThis(this: I) {
|
||||
>InterfaceThis : (this: I) => void
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
// @strictThis: true
|
||||
// body checking
|
||||
class B {
|
||||
n: number;
|
||||
}
|
||||
class C {
|
||||
n: number;
|
||||
explicitThis(this: this, m: number): number {
|
||||
@ -19,9 +22,6 @@ class C {
|
||||
}
|
||||
}
|
||||
class D extends C { }
|
||||
class B {
|
||||
n: number;
|
||||
}
|
||||
interface I {
|
||||
a: number;
|
||||
explicitVoid1(this: void): number;
|
||||
@ -185,6 +185,11 @@ d2.implicit = d1.explicit // ok, 'y' in { x, y } (c assignable to f)
|
||||
b1.implicit = d2.implicit // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
b1.explicit = d2.implicit // ok, 'x' and 'y' not in C: { x } (c assignable to f)
|
||||
|
||||
// union assignability
|
||||
|
||||
let b1b2: Base1 | Base2;
|
||||
b1b2.implicit();
|
||||
|
||||
////// use this-type for construction with new ////
|
||||
function InterfaceThis(this: I) {
|
||||
this.a = 12;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user