Skip to content

Overloaded Function Signature: Can't delegate to function with same signature #15180

@tp

Description

@tp

TypeScript Version: 2.2.1

Code

interface NumberOption {
    returnNumber: true;
}

interface NoNumberOption {
    returnNumber?: false;
}

function eitherOuter(option: NumberOption): number;
function eitherOuter(option: NoNumberOption): string;
function eitherOuter(option: NumberOption | NoNumberOption = {}): string | number {
    // return eitherInner(option); // Does not compile
    if (option.returnNumber === true) {
        return eitherInner(option);
    } else {
        return eitherInner(option);
    }
}

function eitherInner(option: NumberOption): number;
function eitherInner(option: NoNumberOption): string;
function eitherInner(option: NumberOption | NoNumberOption = {}): string | number {
    if (option.returnNumber) {
        return 1;
    } else {
        return 's';
    }
}

const n = eitherOuter({ returnNumber: true });
const s1 = eitherOuter({ returnNumber: false });
const s2 = eitherOuter({});

Expected behavior:
I would expect to be able to delegate from eitherOuter to eitherInner without any special annotations.

Actual behavior:
Delegating from eitherOuter to eitherInner is not possible, instead the simplest workaround I was able to find was to write an if statement, which had the same statement in both branches.

Metadata

Metadata

Assignees

No one assigned

    Labels

    FixedA PR has been merged for this issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions