Sobes.tech
Middle+

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

sobes.tech AI

Odpowiedź od AI

W pierwszej wersji funkcji getObjField parametry mają typ any, co nie pozwala na sprawdzanie typów i może prowadzić do błędów, na przykład podczas odwoływania się do nieistniejącego klucza.

W drugiej wersji używany jest generyk z ograniczeniem K extends keyof T, co gwarantuje, że klucz key rzeczywiście istnieje w obiekcie obj. To zwiększa bezpieczeństwo i wygodę korzystania z funkcji.

Przykład:

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"); // typ: string
const value2 = getObjField(user, "age");  // typ: number
// const value3 = getObjField(user, "test"); // Błąd kompilacji, klucz "test" nie istnieje w Obj

W ten sposób, druga wersja funkcji zapewnia bezpieczeństwo typów i zapobiega błędom na etapie kompilacji.