Skip to content

Cannot overload interface method with different return types #54354

Closed
@enisdenjo

Description

@enisdenjo

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;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Working as IntendedThe behavior described is the intended behavior; this is not a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions