From 4197a30f0caffaf8bfdd4c5f57cba12353417d0b Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Thu, 31 Mar 2016 14:32:56 -0700 Subject: [PATCH] Improve error messages and always return any from newed functions Previously, functions that specified a type for `this` would return that type. Now they return `any`. This helps prevent unintentional use of this feature when --noImplicitAny is turned on. The type of `this` is still checked in the body of these functions. --- src/compiler/checker.ts | 10 +-- src/compiler/diagnosticMessages.json | 8 ++- .../looseThisTypeInFunctions.errors.txt | 8 +-- .../reference/thisTypeInFunctions.types | 8 +-- .../thisTypeInFunctionsNegative.errors.txt | 68 +++++++++---------- 5 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 45ec89086f6..37f714a6e09 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5480,7 +5480,7 @@ namespace ts { || compareTypes(target.thisType, source.thisType, reportErrors); if (!related) { if (reportErrors) { - errorReporter(Diagnostics.Types_of_parameters_0_and_1_are_incompatible, "this", "this"); + errorReporter(Diagnostics.this_types_of_each_signature_are_incompatible); } return Ternary.False; } @@ -10223,7 +10223,7 @@ namespace ts { const thisArgumentNode = getThisArgumentOfCall(node); const thisArgumentType = thisArgumentNode ? checkExpression(thisArgumentNode) : voidType; const errorNode = reportErrors ? (thisArgumentNode || node) : undefined; - const headMessage = Diagnostics.this_context_of_type_0_is_not_assignable_to_method_this_of_type_1; + const headMessage = Diagnostics.this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1; if (!checkTypeRelatedTo(thisArgumentType, signature.thisType, relation, errorNode, headMessage)) { return false; } @@ -10929,7 +10929,7 @@ namespace ts { // If expressionType's apparent type is an object type with no construct signatures but // one or more call signatures, the expression is processed as a function call. A compile-time // error occurs if the result of the function call is not Void. The type of the result of the - // operation is the function's this type. It is an error to have a Void this type. + // operation is Any. It is an error to have a Void this type. const callSignatures = getSignaturesOfType(expressionType, SignatureKind.Call); if (callSignatures.length) { const signature = resolveCall(node, callSignatures, candidatesOutArray); @@ -11117,10 +11117,10 @@ namespace ts { if (funcSymbol && funcSymbol.members && (funcSymbol.flags & SymbolFlags.Function)) { return getInferredClassType(funcSymbol); } - else if (compilerOptions.noImplicitAny && !signature.thisType) { + else if (compilerOptions.noImplicitAny) { error(node, Diagnostics.new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type); } - return signature.thisType || anyType; + return anyType; } } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 1fa9151d500..fcca93b92dc 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1879,7 +1879,7 @@ "category": "Error", "code": 2678 }, - "A function that is called with the 'new' keyword cannot have a 'this' type that is void.": { + "A function that is called with the 'new' keyword cannot have a 'this' type that is 'void'.": { "category": "Error", "code": 2679 }, @@ -1899,10 +1899,14 @@ "category": "Error", "code": 2683 }, - "'this' context of type '{0}' is not assignable to method 'this' of type '{1}'.": { + "'this' context of type '{0}' is not assignable to method's 'this' of type '{1}'.": { "category": "Error", "code": 2684 }, + "'this' types of each signature are incompatible.": { + "category": "Error", + "code": 2685 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", "code": 4000 diff --git a/tests/baselines/reference/looseThisTypeInFunctions.errors.txt b/tests/baselines/reference/looseThisTypeInFunctions.errors.txt index 69e9493b24a..c290ad2d833 100644 --- a/tests/baselines/reference/looseThisTypeInFunctions.errors.txt +++ b/tests/baselines/reference/looseThisTypeInFunctions.errors.txt @@ -1,8 +1,8 @@ tests/cases/conformance/types/thisType/looseThisTypeInFunctions.ts(21,1): error TS2322: Type '(this: C, m: number) => number' is not assignable to type '(this: void, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'void' is not assignable to type 'C'. tests/cases/conformance/types/thisType/looseThisTypeInFunctions.ts(33,28): error TS2339: Property 'length' does not exist on type 'number'. -tests/cases/conformance/types/thisType/looseThisTypeInFunctions.ts(37,9): error TS2684: 'this' context of type 'void' is not assignable to method 'this' of type 'I'. +tests/cases/conformance/types/thisType/looseThisTypeInFunctions.ts(37,9): error TS2684: 'this' context of type 'void' is not assignable to method's 'this' of type 'I'. tests/cases/conformance/types/thisType/looseThisTypeInFunctions.ts(46,20): error TS2339: Property 'length' does not exist on type 'number'. @@ -30,7 +30,7 @@ tests/cases/conformance/types/thisType/looseThisTypeInFunctions.ts(46,20): error c.explicitVoid = c.explicitThis; // error, 'void' is missing everything ~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: C, m: number) => number' is not assignable to type '(this: void, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'void' is not assignable to type 'C'. let o = { n: 101, @@ -51,7 +51,7 @@ tests/cases/conformance/types/thisType/looseThisTypeInFunctions.ts(46,20): error let x = i.explicitThis; let n = x(12); // callee:void doesn't match this:I ~~~~~ -!!! error TS2684: 'this' context of type 'void' is not assignable to method 'this' of type 'I'. +!!! error TS2684: 'this' context of type 'void' is not assignable to method's 'this' of type 'I'. let u: Unused; let y = u.implicitNoThis; n = y(12); // ok, callee:void matches this:any diff --git a/tests/baselines/reference/thisTypeInFunctions.types b/tests/baselines/reference/thisTypeInFunctions.types index 48186eee2d0..24d3bf9f178 100644 --- a/tests/baselines/reference/thisTypeInFunctions.types +++ b/tests/baselines/reference/thisTypeInFunctions.types @@ -895,13 +895,13 @@ function AnyThis(this: any) { >"ok" : string } let interfaceThis = new InterfaceThis(); ->interfaceThis : I ->new InterfaceThis() : I +>interfaceThis : any +>new InterfaceThis() : any >InterfaceThis : (this: I) => void let literalTypeThis = new LiteralTypeThis(); ->literalTypeThis : { x: string; } ->new LiteralTypeThis() : { x: string; } +>literalTypeThis : any +>new LiteralTypeThis() : any >LiteralTypeThis : (this: { x: string; }) => void let anyThis = new AnyThis(); diff --git a/tests/baselines/reference/thisTypeInFunctionsNegative.errors.txt b/tests/baselines/reference/thisTypeInFunctionsNegative.errors.txt index 41711b526c7..955469f9bf3 100644 --- a/tests/baselines/reference/thisTypeInFunctionsNegative.errors.txt +++ b/tests/baselines/reference/thisTypeInFunctionsNegative.errors.txt @@ -1,7 +1,7 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(16,15): error TS2339: Property 'n' does not exist on type 'void'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(39,21): error TS2339: Property 'a' does not exist on type 'void'. -tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(49,1): error TS2684: 'this' context of type 'void' is not assignable to method 'this' of type '{ a: number; }'. -tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(51,1): error TS2684: 'this' context of type 'void' is not assignable to method 'this' of type 'I'. +tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(49,1): error TS2684: 'this' context of type 'void' is not assignable to method's 'this' of type '{ a: number; }'. +tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(51,1): error TS2684: 'this' context of type 'void' is not assignable to method's 'this' of type 'I'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(56,21): error TS2339: Property 'notFound' does not exist on type '{ y: number; }'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(59,21): error TS2339: Property 'notSpecified' does not exist on type 'void'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(61,79): error TS2322: Type '{ y: number; explicitStructural: (this: { y: number; }, x: number) => number; }' is not assignable to type '{ y: number; f: (this: { y: number; }, x: number) => number; }'. @@ -13,10 +13,10 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(63,110): e tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(65,1): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(66,6): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(67,1): error TS2346: Supplied parameters do not match any signature of call target. -tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(68,1): error TS2684: 'this' context of type '{ y: string; f: (this: { y: number; }, x: number) => number; }' is not assignable to method 'this' of type '{ y: number; }'. +tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(68,1): error TS2684: 'this' context of type '{ y: string; f: (this: { y: number; }, x: number) => number; }' is not assignable to method's 'this' of type '{ y: number; }'. Types of property 'y' are incompatible. Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(69,1): error TS2684: 'this' context of type '{ wrongName: number; f: (this: { y: number; }, x: number) => number; }' is not assignable to method 'this' of type '{ y: number; }'. +tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(69,1): error TS2684: 'this' context of type '{ wrongName: number; f: (this: { y: number; }, x: number) => number; }' is not assignable to method's 'this' of type '{ y: number; }'. Property 'y' is missing in type '{ wrongName: number; f: (this: { y: number; }, x: number) => number; }'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(72,1): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(73,13): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. @@ -31,49 +31,49 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(81,1): err tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(82,20): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(83,1): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(86,5): error TS2322: Type '(this: { y: number; }, x: number) => number' is not assignable to type '(this: void, x: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'void' is not assignable to type '{ y: number; }'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(107,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'C' is not assignable to type 'D'. Property 'x' is missing in type 'C'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(108,1): error TS2322: Type '(this: { x: number; }, m: number) => number' is not assignable to type '(this: { n: number; }, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type '{ n: number; }' is not assignable to type '{ x: number; }'. Property 'x' is missing in type '{ n: number; }'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(110,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'C' is not assignable to type 'D'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(111,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'C' is not assignable to type 'D'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(112,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'C' is not assignable to type 'D'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(113,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'C' is not assignable to type 'D'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(114,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: { n: number; }, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type '{ n: number; }' is not assignable to type 'D'. Property 'x' is missing in type '{ n: number; }'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(115,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(116,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: void, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'void' is not assignable to type 'D'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(117,1): error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: void, m: number) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'void' is not assignable to type 'D'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(125,69): error TS2339: Property 'x' does not exist on type 'typeof Base1'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(145,1): error TS2322: Type '(this: Base2) => number' is not assignable to type '(this: Base1) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'Base1' is not assignable to type 'Base2'. Property 'y' is missing in type 'Base1'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(146,1): error TS2322: Type '(this: Base2) => number' is not assignable to type '(this: Base1) => number'. - Types of parameters 'this' and 'this' are incompatible. + 'this' types of each signature are incompatible. Type 'Base1' is not assignable to type 'Base2'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(148,1): error TS2322: Type '(this: Base2) => number' is not assignable to type '(this: Base1) => number'. -tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(154,16): error TS2679: A function that is called with the 'new' keyword cannot have a 'this' type that is void. +tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(154,16): error TS2679: A function that is called with the 'new' keyword cannot have a 'this' type that is 'void'. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(158,17): error TS2681: A constructor cannot have a 'this' parameter. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(160,11): error TS2682: A setter cannot have a 'this' parameter. tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(164,9): error TS2681: A constructor cannot have a 'this' parameter. @@ -154,11 +154,11 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(176,35): e let implExplicitStructural = impl.explicitStructural; implExplicitStructural(); // error, no 'a' in 'void' ~~~~~~~~~~~~~~~~~~~~~~~~ -!!! error TS2684: 'this' context of type 'void' is not assignable to method 'this' of type '{ a: number; }'. +!!! error TS2684: 'this' context of type 'void' is not assignable to method's 'this' of type '{ a: number; }'. let implExplicitInterface = impl.explicitInterface; implExplicitInterface(); // error, no 'a' in 'void' ~~~~~~~~~~~~~~~~~~~~~~~ -!!! error TS2684: 'this' context of type 'void' is not assignable to method 'this' of type 'I'. +!!! error TS2684: 'this' context of type 'void' is not assignable to method's 'this' of type 'I'. function explicitStructural(this: { y: number }, x: number): number { return x + this.y; } @@ -196,12 +196,12 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(176,35): e !!! error TS2346: Supplied parameters do not match any signature of call target. wrongPropertyType.f(13); ~~~~~~~~~~~~~~~~~ -!!! error TS2684: 'this' context of type '{ y: string; f: (this: { y: number; }, x: number) => number; }' is not assignable to method 'this' of type '{ y: number; }'. +!!! error TS2684: 'this' context of type '{ y: string; f: (this: { y: number; }, x: number) => number; }' is not assignable to method's 'this' of type '{ y: number; }'. !!! error TS2684: Types of property 'y' are incompatible. !!! error TS2684: Type 'string' is not assignable to type 'number'. wrongPropertyName.f(13); ~~~~~~~~~~~~~~~~~ -!!! error TS2684: 'this' context of type '{ wrongName: number; f: (this: { y: number; }, x: number) => number; }' is not assignable to method 'this' of type '{ y: number; }'. +!!! error TS2684: 'this' context of type '{ wrongName: number; f: (this: { y: number; }, x: number) => number; }' is not assignable to method's 'this' of type '{ y: number; }'. !!! error TS2684: Property 'y' is missing in type '{ wrongName: number; f: (this: { y: number; }, x: number) => number; }'. let c = new C(); @@ -246,7 +246,7 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(176,35): e let specifiedToVoid: (this: void, x: number) => number = explicitStructural; ~~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: { y: number; }, x: number) => number' is not assignable to type '(this: void, x: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'void' is not assignable to type '{ y: number; }'. let reconstructed: { @@ -271,40 +271,40 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(176,35): e c.explicitC = function(this: D, m: number) { return this.x + m }; ~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'C' is not assignable to type 'D'. !!! error TS2322: Property 'x' is missing in type 'C'. c.explicitProperty = explicitXProperty; ~~~~~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: { x: number; }, m: number) => number' is not assignable to type '(this: { n: number; }, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type '{ n: number; }' is not assignable to type '{ x: number; }'. !!! error TS2322: Property 'x' is missing in type '{ n: number; }'. c.explicitC = d.explicitD; ~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'C' is not assignable to type 'D'. c.explicitC = d.explicitThis; ~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'C' is not assignable to type 'D'. c.explicitThis = d.explicitD; ~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'C' is not assignable to type 'D'. c.explicitThis = d.explicitThis; ~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: C, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'C' is not assignable to type 'D'. c.explicitProperty = d.explicitD; ~~~~~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: { n: number; }, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type '{ n: number; }' is not assignable to type 'D'. !!! error TS2322: Property 'x' is missing in type '{ n: number; }'. c.explicitThis = d.explicitThis; @@ -313,12 +313,12 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(176,35): e c.explicitVoid = d.explicitD; ~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: void, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'void' is not assignable to type 'D'. c.explicitVoid = d.explicitThis; ~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: D, m: number) => number' is not assignable to type '(this: void, m: number) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'void' is not assignable to type 'D'. /// class-based polymorphic assignability (with inheritance!) /// @@ -352,13 +352,13 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(176,35): e b1.polymorphic = b2.polymorphic // error, 'this.y' not in Base1: { x } ~~~~~~~~~~~~~~ !!! error TS2322: Type '(this: Base2) => number' is not assignable to type '(this: Base1) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'Base1' is not assignable to type 'Base2'. !!! error TS2322: Property 'y' is missing in type 'Base1'. b1.explicit = b2.polymorphic // error, 'y' not in Base1: { x } ~~~~~~~~~~~ !!! error TS2322: Type '(this: Base2) => number' is not assignable to type '(this: Base1) => number'. -!!! error TS2322: Types of parameters 'this' and 'this' are incompatible. +!!! error TS2322: 'this' types of each signature are incompatible. !!! error TS2322: Type 'Base1' is not assignable to type 'Base2'. d1.explicit = b2.polymorphic // error, 'y' not in Base1: { x } @@ -371,7 +371,7 @@ tests/cases/conformance/types/thisType/thisTypeInFunctionsNegative.ts(176,35): e } let voidThis = new VoidThis(); ~~~~~~~~~~~~~~ -!!! error TS2679: A function that is called with the 'new' keyword cannot have a 'this' type that is void. +!!! error TS2679: A function that is called with the 'new' keyword cannot have a 'this' type that is 'void'. ///// syntax-ish errors ///// class ThisConstructor {