Skip to content

Better errors for types with same name #1575

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
10 changes: 9 additions & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3508,7 +3508,15 @@ module ts {
}
if (reportErrors) {
headMessage = headMessage || Diagnostics.Type_0_is_not_assignable_to_type_1;
reportError(headMessage, typeToString(source), typeToString(target));
var sourceType = typeToString(source);
var targetType = typeToString(target);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i would write this as:

if (sourceType === targetType) {
    sourceType = typeToString(...);
    targetType = typeToString(...);
}

reportError(headMessage, sourceType, targetType)

if (sourceType !== targetType) {
reportError(headMessage, sourceType, targetType);
} else {
// If the types are incompatible but have the same name, use the qualified names to give
// a more insightful error message
reportError(headMessage, getFullyQualifiedName(source.symbol), getFullyQualifiedName(target.symbol));
}
}
return Ternary.False;
}
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/clodulesDerivedClasses.errors.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
tests/cases/compiler/clodulesDerivedClasses.ts(9,7): error TS2417: Class static side 'typeof Path' incorrectly extends base class static side 'typeof Shape'.
Types of property 'Utils' are incompatible.
Type 'typeof Utils' is not assignable to type 'typeof Utils'.
Type 'Path.Utils' is not assignable to type 'Shape.Utils'.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is actually a regression - I think it should be 'typeof Path.Utils' and 'typeof Shape.Utils'.

Property 'convert' is missing in type 'typeof Utils'.


Expand All @@ -17,7 +17,7 @@ tests/cases/compiler/clodulesDerivedClasses.ts(9,7): error TS2417: Class static
~~~~
!!! error TS2417: Class static side 'typeof Path' incorrectly extends base class static side 'typeof Shape'.
!!! error TS2417: Types of property 'Utils' are incompatible.
!!! error TS2417: Type 'typeof Utils' is not assignable to type 'typeof Utils'.
!!! error TS2417: Type 'Path.Utils' is not assignable to type 'Shape.Utils'.
!!! error TS2417: Property 'convert' is missing in type 'typeof Utils'.
name: string;

Expand Down
22 changes: 22 additions & 0 deletions tests/baselines/reference/differentTypesWithSameName.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
tests/cases/compiler/differentTypesWithSameName.ts(16,15): error TS2345: Argument of type 'variable' is not assignable to parameter of type 'm.variable'.


==== tests/cases/compiler/differentTypesWithSameName.ts (1 errors) ====
module m {
export class variable{
s: string;
}
export function doSomething(v: m.variable) {

}
}

class variable {
t: number;
}


var v: variable = new variable();
m.doSomething(v);
~
!!! error TS2345: Argument of type 'variable' is not assignable to parameter of type 'm.variable'.
38 changes: 38 additions & 0 deletions tests/baselines/reference/differentTypesWithSameName.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//// [differentTypesWithSameName.ts]
module m {
export class variable{
s: string;
}
export function doSomething(v: m.variable) {

}
}

class variable {
t: number;
}


var v: variable = new variable();
m.doSomething(v);

//// [differentTypesWithSameName.js]
var m;
(function (m) {
var variable = (function () {
function variable() {
}
return variable;
})();
m.variable = variable;
function doSomething(v) {
}
m.doSomething = doSomething;
})(m || (m = {}));
var variable = (function () {
function variable() {
}
return variable;
})();
var v = new variable();
m.doSomething(v);
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ tests/cases/conformance/statements/VariableStatements/everyTypeWithAnnotationAnd
Type 'string' is not assignable to type 'number'.
tests/cases/conformance/statements/VariableStatements/everyTypeWithAnnotationAndInvalidInitializer.ts(50,5): error TS2322: Type 'typeof N' is not assignable to type 'typeof M'.
Types of property 'A' are incompatible.
Type 'typeof A' is not assignable to type 'typeof A'.
Type 'A' is not assignable to type 'A'.
Type 'N.A' is not assignable to type 'M.A'.
Type 'N.A' is not assignable to type 'M.A'.
Property 'name' is missing in type 'A'.
tests/cases/conformance/statements/VariableStatements/everyTypeWithAnnotationAndInvalidInitializer.ts(51,5): error TS2322: Type 'A' is not assignable to type 'A'.
tests/cases/conformance/statements/VariableStatements/everyTypeWithAnnotationAndInvalidInitializer.ts(51,5): error TS2322: Type 'N.A' is not assignable to type 'M.A'.
tests/cases/conformance/statements/VariableStatements/everyTypeWithAnnotationAndInvalidInitializer.ts(52,5): error TS2322: Type '(x: number) => boolean' is not assignable to type '(x: number) => string'.
Type 'boolean' is not assignable to type 'string'.

Expand Down Expand Up @@ -124,12 +124,12 @@ tests/cases/conformance/statements/VariableStatements/everyTypeWithAnnotationAnd
~~~~~~~
!!! error TS2322: Type 'typeof N' is not assignable to type 'typeof M'.
!!! error TS2322: Types of property 'A' are incompatible.
!!! error TS2322: Type 'typeof A' is not assignable to type 'typeof A'.
!!! error TS2322: Type 'A' is not assignable to type 'A'.
!!! error TS2322: Type 'N.A' is not assignable to type 'M.A'.
!!! error TS2322: Type 'N.A' is not assignable to type 'M.A'.
!!! error TS2322: Property 'name' is missing in type 'A'.
var aClassInModule: M.A = new N.A();
~~~~~~~~~~~~~~
!!! error TS2322: Type 'A' is not assignable to type 'A'.
!!! error TS2322: Type 'N.A' is not assignable to type 'M.A'.
var aFunctionInModule: typeof M.F2 = F2;
~~~~~~~~~~~~~~~~~
!!! error TS2322: Type '(x: number) => boolean' is not assignable to type '(x: number) => string'.
Expand Down
4 changes: 2 additions & 2 deletions tests/baselines/reference/qualify.errors.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ tests/cases/compiler/qualify.ts(47,13): error TS2322: Type 'I4' is not assignabl
tests/cases/compiler/qualify.ts(48,13): error TS2322: Type 'I4' is not assignable to type '(k: I3) => void'.
tests/cases/compiler/qualify.ts(49,13): error TS2322: Type 'I4' is not assignable to type '{ k: I3; }'.
Property 'k' is missing in type 'I4'.
tests/cases/compiler/qualify.ts(58,5): error TS2322: Type 'I' is not assignable to type 'I'.
tests/cases/compiler/qualify.ts(58,5): error TS2322: Type 'I' is not assignable to type 'T.I'.
Property 'p' is missing in type 'I'.


Expand Down Expand Up @@ -93,7 +93,7 @@ tests/cases/compiler/qualify.ts(58,5): error TS2322: Type 'I' is not assignable
var y:I;
var x:T.I=y;
~
!!! error TS2322: Type 'I' is not assignable to type 'I'.
!!! error TS2322: Type 'I' is not assignable to type 'T.I'.
!!! error TS2322: Property 'p' is missing in type 'I'.


16 changes: 16 additions & 0 deletions tests/cases/compiler/differentTypesWithSameName.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module m {
export class variable{
s: string;
}
export function doSomething(v: m.variable) {

}
}

class variable {
t: number;
}


var v: variable = new variable();
m.doSomething(v);