Closed
Description
Bug Report
Defining an overloaded method in an interface raises an error during implementation if overloads have different return types.
🔎 Search Terms
overload
, method
, interface
, factory function
🕗 Version & Regression Information
Doesn't work in v3, v4 or v5.
⏯ Playground Link
Playground link with relevant code
💻 Code
interface Shape {
area(x: number): number;
area(x: number, y: number): string;
}
🙁 Actual behavior
class ShapeImpl implements Shape {
// ❌
area(_x: number, _y?: number): number | string {
return 0;
}
}
function createShape(): Shape {
return {
// ❌
area(_x: number, _y?: number): number | string {
return 0;
},
};
}
🙂 Expected behavior
class ShapeImpl implements Shape {
// ✅
area(_x: number, _y?: number): number | string {
return 0;
}
}
function createShape(): Shape {
return {
// ✅
area(_x: number, _y?: number): number | string {
return 0;
},
};
}
More details
If the return type does not change, overloads work as expected.
✅
interface Shape {
area(x: number): number;
area(x: number, y: number): number; // 👈
}
class ShapeImpl implements Shape {
area(_x: number, _y?: number): number {
return 0;
}
}
function createShape(): Shape {
return {
area(_x: number, _y?: number): number {
return 0;
},
};
}
Also works if the overloads are defined in the class or on root level functions
✅
class Shape {
area(x: number): number;
area(x: number, y: number): string;
area(_x: number, _y?: number): number | string {
return 0;
}
}
function area(x: number): number;
function area(x: number, y: number): string;
function area(_x: number, _y?: number): number | string {
return 0;
}