Непонятная машинопись перегружена функцией c перегрузки - PullRequest
2 голосов
/ 19 марта 2020

Во время изучения TypeScript я заметил странное поведение.

function concat5<T>(strs: T, strs2: T): T;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}

concat5(123, 12);
concat5({a:1}, {b:2});

Я думаю, что этот код является ошибкой. Однако в среде IDE ошибки не возникает.

Почему?

1 Ответ

2 голосов
/ 19 марта 2020

TypeScript не совпадает с Java / C#, где Type является частью среды выполнения, JavaScript не имеет ограничения типа среды выполнения, нет ошибок приведения типов, нет ошибок преобразования типов, все типы в TypeScript остаются только в редакторе и в компиляторе после компиляции все типы go исчезают. И JavaScript также не имеет перегрузки функции, так как нет типов, каждый тип объекта может быть передан в функцию в качестве аргумента.

В вашем случае перегрузки функции являются только объявлениями и не могут автоматически обнаруживать ошибки на основе реализации. Он может обнаруживать только ошибки на основе указанных типов .

function concat5<T>(strs: T, strs2: T): T; только говорит о том, что оба типа strs и strs2 должны быть одного типа, ограничения на этот * 1010 отсутствуют. * возможно.

В результате выдается ошибка, в которой говорится, что реализация не соответствует объявлению.

function concat5<T>(strs: T, strs2: number): T;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}

Посмотрим на этот пример,

function concat5<T extends number>(strs: T, strs2: T): T;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}
function concat5<T1 extends number, T2>(strs: T1, strs2: T2): T1;
function concat5(strs: string, strs2: string) {
    return strs + strs2;
}

Причина, по которой это не дает никакой ошибки, заключается в том, что JavaScript может принимать любой объект для ввода строки, поскольку в конечном итоге он преобразует все объекты в строку, поэтому в этом случае это не приведет к ошибочной реализации. Пока оба параметра не указаны явно.

Для удовольствия Если вы откроете консоль Chrome и наберете {} + {}, вы увидите результат [object Object][object Object] , JavaScript позволяет объединять любые два типа, они преобразуются в строку.

>{} + 2
< 2
>2 + {}
<"2[object Object]"
>null + 2
<2
>2 + undefined
<NaN
>2 + (function(){ return 3; })
<"2function(){ return 3; }"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...