#typescript
#typescript
Вопрос:
Рассмотрим этот код, который приводит к ошибке компилятора TS:
interface Car {
manufacturer: string;
model: string;
}
let taxi: Car = {
manufacturer: 'Toyota',
model: 'Camry',
};
// this code returns an error. why??
function getProperty<T, K extends keyof T>(o: T, propertyName: K): K {
return o[propertyName];
}
let makeAndModel: string[] = getProperty(taxi, 'model');
T
является произвольным типом, и K extends keyof T
(т.е. K должен быть одним из T
ключей, в нашем случае это может быть manufacturer
или model
). В функции возвращаемый тип мы объявляем K
как наш возвращаемый тип, поэтому мы уже сообщаем компилятору: «Эй, эта функция может возвращать только переменную типа ( K
), которая должна быть одним из ключей taxi ( T
) ( manufacturer
, model
) .
Вот и все. Это все, что должен знать компилятор. Мы уже ограничились K
одним T
ключом. Почему тогда нам нужно окружать K
дополнительными []
прямо здесь:
// this code works. why??
function getProperty<T, K extends keyof T>(o: T, propertyName: K): [K] { // additional []. any reason?
return o[propertyName];
}
Комментарии:
1. Пусть типы текут. TypeScript — это наличие типов, не использующих then во всех возможных позициях и тем самым затрудняющих вывод типа.
Ответ №1:
Возвращаемый тип неверен. Вы возвращаете значение, а не ключ, поэтому оно должно быть:
function getProperty<T, K extends keyof T>(o: T, propertyName: K): T[K] {
return o[propertyName];
}