Typescript. Проблема с типизацией getValue. Можно ли тут использовать без as?

Вопрос, связанный с типизацией функции getValue в TypeScript, очень интересный. Давайте рассмотрим, что именно происходит.

Предположим, у вас есть функция getValue, которая принимает один аргумент - объект obj, и возвращает его значение, которое находится по ключу key:

function getValue(obj: {[key: string]: any}, key: string): any {
  return obj[key];
}

Однако, проблема с этой функцией заключается в том, что она использует оператор индексации [key: string], а типизация этого оператора по умолчанию - any. Это означает, что функция getValue не имеет информации о точном типе значения, которое она возвращает. В результате, при использовании этой функции, вы не сможете использовать возвращенное значение без приведения типа.

Таким образом, чтобы избежать необходимости использования оператора as для приведения типа возвращаемого значения, вам потребуется предоставить более точную типизацию функции getValue.

Самый простой способ это сделать - это использовать обобщенные типы в TypeScript:

function getValue<T>(obj: {[key: string]: T}, key: string): T {
  return obj[key];
}

Теперь функция getValue принимает тип T в качестве аргумента, который является типом возвращаемого значения. Это означает, что при вызове функции getValue вы можете указать ожидаемый тип возвращаемого значения, и TypeScript будет проверять соответствие типов.

Пример использования функции getValue:

const obj = {
  name: 'John',
  age: 30
};

const name: string = getValue<string>(obj, 'name');
const age: number = getValue<number>(obj, 'age');

В этом примере мы вызываем функцию getValue, указывая ожидаемые типы возвращаемых значений для ключей "name" и "age". Теперь TypeScript может гарантировать, что возвращаемые значения будут соответствовать указанным типам, и не требуется использования оператора as для приведения типов.

Таким образом, с использованием обобщенных типов в TypeScript, вы можете избежать необходимости использования оператора as для приведения типов в функции getValue. Это позволит вам получить более типизированный и безопасный код.