Странный синтаксис оператора доступа к индексу

#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];
}
  

Игровая площадка