Почему Typescript разрешает некорректные возвраты перегруженной функции? - PullRequest
1 голос
/ 17 октября 2019

В этот ответ сопровождающий Typescript дает простой пример того, как перегрузка работает в Typescript и как он отличается от языков с реальной перегрузкой.

Однако изменяя ихпример к следующему все еще компилируется:

function numberStringSwitch(x: string): number;
function numberStringSwitch(x: number): string;
function numberStringSwitch(x: string | number) {
    return x;
}

Мне кажется, что он не должен быть действительным;почему это разрешено? Как сделать так, чтобы этот пример не компилировался так, как я ожидал?

Ссылка для игровой площадки , TS 3.6.3

1 Ответ

1 голос
/ 17 октября 2019

Это должно быть довольно просто - есть 2 возможных ввода для вашего numberStringSwitch метода - string или number - и это именно то, что объединения в машинописи. Это означает, что вы можете написать свой метод "реализации", используя сигнатуру объединения, которая равна string | number - это важно, потому что, когда вы пишете основную часть вашего метода, вам нужно иметь безопасно напечатанный ввод, который представляет объединение всех ваших входов перегрузки (в данном случаелибо string, либо number). Конечно, вы можете использовать any, как они, но это объединение также является опцией (честно, более читабельная опция для меня).

Вы можете попробовать изменить входные данные на что-то, чего нет в ваших перегрузках. методы, и вы получите ошибку

// error
function numberStringSwitch(x: string | Date) {
    return x;
}

Но если вы добавите еще одну перегрузку с помощью Date и добавите ее тип параметра в окончательное объединение, это сработает:

// works
function numberStringSwitch(x: string): number;
function numberStringSwitch(x: number): string;
function numberStringSwitch(x: Date): string;
function numberStringSwitch(x: string | number | Date) {
    return x;
}
...