большой вопрос о дженериках в typescript

#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 .