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; }"