typescript перегрузка возвращаемого значения функции
Нашел вот такой пример перегрузки функции
// сигнатуры перегрузки
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;
}
};
Как правильно реализовать такую перегрузку?
Ответы (1 шт):
Не нужно такого хотеть.
Но если очень хочется что бы функция возвращала разные типы, то надо использовать перегрузку функций
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
Но тут проблема в том, что внутри реализации вам придётся самостоятельно следить что функция возвращает правильный тип. Например в примере выше легко ошибится (что я и сделал сначала) и в else написать return new Date(mOrTimestamp); и TS вам об этом не скажет, а ошибку вы поймаете только при запуске.