typescript перегрузка возвращаемого значения функции

Рейтинг: 0Ответов: 1Опубликовано: 16.04.2023

Нашел вот такой пример перегрузки функции

// сигнатуры перегрузки
type MakeDate = {
    (timestamp: number): Date;
    (m: number, d: number, y: number): Date;
};

// сигнатура реализации
const makeDate: MakeDate = (mOrTimestamp: number, d?: number, y?: number): Date => {
    if (d !== undefined && y !== undefined) {
        return new Date(y, mOrTimestamp, d);
    } else {
        return new Date(mOrTimestamp);
    }
};

Работает отлично, никаких проблем с ним нет. Но если пытаюсь изменить тип возвращаемого значения одной из перегрузок, то typescript выдает ошибку:

Type 'number | Date' is not assignable to type 'number'.

// сигнатуры перегрузки
type MakeDate = {
    (timestamp: number): number;
    (m: number, d: number, y: number): Date;
};

// сигнатура реализации
const makeDate: MakeDate = (mOrTimestamp: number, d?: number, y?: number): Date | number => {
    if (d !== undefined && y !== undefined) {
        return new Date(y, mOrTimestamp, d);
    } else {
        return mOrTimestamp;
    }
};

Как правильно реализовать такую перегрузку?

Ответы

▲ 4Принят

Не нужно такого хотеть.

Но если очень хочется что бы функция возвращала разные типы, то надо использовать перегрузку функций

function makeDate(timestamp: number): number;
function makeDate(m: number, d: number, y: number): Date;
function makeDate(mOrTimestamp: number, d?: number, y?: number): Date | number {
    if (d !== undefined && y !== undefined) {
        return new Date(y, mOrTimestamp, d);
    } else {
        return mOrTimestamp;
    }
};

let q = makeDate(1,2,3);
//  ^? Date
let z = makeDate(1);
//  ^? number

playground

Но тут проблема в том, что внутри реализации вам придётся самостоятельно следить что функция возвращает правильный тип. Например в примере выше легко ошибится (что я и сделал сначала) и в else написать return new Date(mOrTimestamp); и TS вам об этом не скажет, а ошибку вы поймаете только при запуске.