#javascript #typescript #function #generics
#javascript #typescript #функция #дженерики
Вопрос:
Прежде чем я начну, я хочу, чтобы вы знали, что я латиноамериканец и не очень хорошо говорю по-английски, поэтому мне пришлось использовать Google для перевода моего вопроса. Я надеюсь, что вы сможете мне помочь.
Я изучаю typescript, и я только что вошел в тему дженериков, все было хорошо, но я нашел пример, который я не могу понять. На следующем изображении, как получается, что typescript знает, что универсальными параметрами функции «сравнить» являются <число, строка>?
class Pair<K, V> {
constructor(public key: K, public value: V) {}
}
function compare <K,V> (pair1: Pair<K,V>, pair2: Pair<K,V>): void {
console.log(pair1, pair2);
}
let p1 = new Pair(1, "Apple");
let p2 = new Pair(1, "Orange");
compare(p1, p2);
Предположительно, эти типы выводятся из отправляемых аргументов, поэтому вызов функции должен выглядеть следующим образом.
compare<Pair<number, string>, Pair<number, string>>();
Я не могу этого понять. Еще одна вещь, которую я заметил, это то, что кажется, что он принимает типы первого аргумента, потому что, если второй объект имеет разные типы, он покажет мне ошибку, как на этом изображении
class Pair<K, V> {
constructor(public key: K, public value: V) {}
}
function compare <K,V> (pair1: Pair<K,V>, pair2: Pair<K,V>): void {
console.log(pair1, pair2);
}
let p1 = new Pair(1, "Apple");
let p2 = new Pair('dani', "Orange");
compare(p1, p2); //error in second argument
Я надеюсь, что вы сможете мне помочь. Я желаю вам всем отличного дня.
Комментарии:
1. Короче говоря: это магия компилятора. Компилятор видит определение pair , которое является универсальным и имеет две переменные типа
K
иV
. Когда вы создаете новую пару, вы назначаете эти переменные типа явно или неявно. Сравнение определяется как взятие двух пар и, следовательно, также должно определять переменные типа. Ключ к дженерикам заключается в следующем: сами типы являются переменными.2. Для последнего вопроса
K
иV
просто означает, что это два разных типа, которые вы сравниваете. Они могут бытьany type
, но ониcannot
будутsame type
. Когда вы создаете новоеPair
и передаете два значения одного и того же типа, то есть две строки, это выдает ошибку. В этом случаеK
имеет типstring
, поэтому проблем нет, ноV
также имеет типstring
, поэтому это проблема, он должен быть другого типа, как указано в функцииcompare
.