Назад к вопросам
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
Таким образом, второй вариант функции обеспечивает типовую безопасность и предотвращает ошибки на этапе компиляции.