Sobes.tech
Назад к вопросам
Middle+
9

type Obj = { name: string age: number } const getObjField = (obj: any, key: any) => { return obj[key] } const user: Obj = { name: "Nik", age: 25 } const value1 = getObjField(user, "name") const value2 = getObjField(user, "age") const value3 = getObjField(user, "test") const getObjField = <T, K extends keyof T>(obj: T, key: K) => { return obj[key] }

Компании, где спрашивали
М.Видео/эльдорадо

Ответ от нейросети

sobes.tech AI

В первом варианте функции getObjField параметры имеют тип any, что не даёт проверки типов и может привести к ошибкам, например, при обращении к несуществующему ключу.

Во втором варианте используется дженерик с ограничением K extends keyof T, что гарантирует, что ключ key действительно существует в объекте obj. Это повышает безопасность и удобство использования функции.

Пример:

type Obj = {
  name: string;
  age: number;
};

const getObjField = <T, K extends keyof T>(obj: T, key: K): T[K] => {
  return obj[key];
};

const user: Obj = { name: "Nik", age: 25 };

const value1 = getObjField(user, "name"); // тип string
const value2 = getObjField(user, "age");  // тип number
// const value3 = getObjField(user, "test"); // Ошибка компиляции, ключа "test" нет в Obj

Таким образом, второй вариант функции обеспечивает типовую безопасность и предотвращает ошибки на этапе компиляции.