TypeScript Keyof
keyof este un cuvânt cheie din TypeScript. El preia un tip de obiect și îți dă tipul cheilor acestuia.
keyof cu chei explicite
Când folosești keyof pe un tip de obiect care își enumeră proprietățile după nume, rezultatul este un tip uniune alcătuit din acele nume de proprietăți.
Exemplu
keyof Person devine uniunea "name" | "age". Transmiterea oricărui alt șir de caractere către funcție este o eroare.
Prompt
Arată cum
keyof aplicat pe o interfață cu proprietăți denumite produce o uniune a acelor nume de proprietăți.
Declară o interfață Person cu name: string și age: number, scrie o funcție care primește un Person și un nume de proprietate de tip keyof Person și afișează valoarea acelei proprietăți, apoi apeleaz-o cu o persoană numită Max, în vârstă de 27 de ani, și proprietatea "name".
Ieșire: program TypeScript și rezultatul capturat
script.ts
interface Person {
name: string;
age: number;
}
// `keyof Person` creează aici un tip uniune format din "name" și "age", alte șiruri de caractere nu vor fi permise
function printPersonProperty(person: Person, property: keyof Person) {
console.log(`Se afișează proprietatea ${property} a persoanei: "${person[property]}"`);
}
let person = {
name: "Max",
age: 27
};
printPersonProperty(person, "name"); // Se afișează proprietatea name a persoanei: "Max"
keyof cu semnături de index
keyof funcționează și pe tipuri care au o semnătură de index. În acel caz îți dă tipul indexului.
Exemplu
Deoarece StringMap acceptă orice cheie de tip șir de caractere, keyof StringMap este pur și simplu string.
Prompt
Arată că
keyof aplicat pe un tip cu o semnătură de index de tip șir de caractere se rezolvă la string.
Definește un tip StringMap cu o semnătură de index [key: string]: unknown și o funcție care primește o cheie de tip keyof StringMap plus o valoare de tip șir de caractere și returnează un nou StringMap care conține acea pereche; exemplul doar declară, nu afișează nimic.
Ieșire: program TypeScript și rezultatul capturat
script.ts
type StringMap = { [key: string]: unknown };
// `keyof StringMap` se rezolvă aici la `string`
function createStringPair(property: keyof StringMap, value: string): StringMap {
return { [property]: value };
}