typescript - Clarificare asupra operatorului de interogare a tipului index și cuvântului cheie extends
Parcurgeam documentația despre Tipuri Avansate în Typescript (găsită aici: https://www.typescriptlang.org/docs/handbook/advanced-types.html) și se menționa Operatorul de Interogare a Indexului și se dădea următorul exemplu:
function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] {
return names.map(n => o[n]);
}
Înțeleg cum keyof produce o reuniune a tuturor numelor de proprietăți publice cunoscute pe obiectul T, dar nu înțeleg exact ce rol joacă extends. Înțeleg că spune că K trebuie să fie o proprietate validă a T, dar de ce se folosește extends și nu altceva? De asemenea, este posibil să extinzi reuniuni în Typescript sau este mai mult o semnificație specifică pentru generice?
Mulțumesc.
Răspuns #1
Cuvântul cheie extends, în acest context, este o modalitate de a adăuga o constrângere asupra unui parametru de tip.
Având acest exemplu simplu, veți vedea că compilatorul permite doar să treceți obiecte care respectă interfața Person:
interface Person {
name: string;
}
function logAndReturnPerson<T extends Person>(person: T) {
console.log(person.name);
return person;
}
// ok
const result1 = logAndReturnPerson<Person>({ name: "David" });
// not ok, string does not satisfy constraint of Person
const result2 = logAndReturnPerson<string>("");
În exemplul tău, K extends keyof T înseamnă că K este restricționat la keyof T. Cu alte cuvinte, asta înseamnă ceea ce ai crezut—K este un șir de caractere care este restricționat să fie un nume de proprietate al T.
Da, acesta este un semantic specific genericelor. Rețineți că este posibil să folosiți un tip de uniune într-o constrângere.
