TypeScript Record
tipas supaprastina objektų struktūrų valdymą su nuosekliais reikšmių tipais. Šis vadovas apima esminius dalykus Record
įskaitant jo apibrėžimą, sintaksę ir kuo ji skiriasi nuo kitų tipų, pvz., kortelių. Išmoksime apibrėžti ir naudoti Record
praktiniais scenarijais, pvz., užtikrinant išsamų bylų tvarkymą ir sąrašų sudarymą. Be to, derindami išnagrinėsime išplėstinius naudojimo būdus Record
su tokiais komunalinių paslaugų tipais kaip Partial
, Pick
ir Readonly
.
Įvadas
The Record
tipas yra naudingumo tipas, leidžiantis sukurti objekto tipą su nurodytais raktais ir vienodu vertės tipu. Šis tipas ypač naudingas nustatant atvaizdus ir užtikrinant, kad visos objekto reikšmės atitiktų vieną tipą.
Įrašo tipo apibrėžimas
Oficialus „TypeScript“ dokumentacijos apibrėžimas yra toks:
Record<Keys, Type>
Čia:
Keys
reiškia įrašo raktų rinkinį, kuris gali būti eilučių literalų junginys arba tipas, gautas iš sąjungos.Type
yra su tais raktais susietų reikšmių tipas.
Pavyzdžiui, Record<string, number>
apibrėžia objektą, kuriame kiekvienas raktas yra eilutė, o kiekviena reikšmė yra skaičius. Šis tipas užtikrina, kad visos objekto savybės turi tą patį reikšmių tipą, tačiau raktai gali būti įvairūs.
Įrašo ir tuple palyginimas
Abu Record
ir korteliai naudojami duomenų rinkiniams tvarkyti, tačiau jie tarnauja skirtingiems tikslams. Net jei jose saugomos kelios vertės, jos skiriasi struktūra ir naudojimu. Įrašas turi fiksuoto tipo pavadintas ypatybes, o eilė yra sutvarkytas elementų sąrašas, identifikuojamas pagal jų padėtį. Štai paprastas palyginimas:
- Įrašas. Sukuria objekto tipą, kuriame visos reikšmės turi tą patį tipą, tačiau raktai gali būti lankstūs. Tai naudinga norint susieti raktus su reikšmėmis ir užtikrinti, kad visi raktai atitiktų konkretų tipą.
- Tuple. Apibrėžia masyvą su fiksuotu elementų skaičiumi, kur kiekvienas elementas gali turėti skirtingą tipą. Kortelės naudojamos, kai mums reikia fiksuoto dydžio kolekcijos su konkrečiais tipais kiekvienai pozicijai.
Pavyzdžiui, apsvarstykite šiuos dalykus.
Štai a Record
tipas, kuris susieja eilučių raktus su skaičių reikšmėmis:
type AgeMap = Record<string, number>;
Kortelės tipas reiškia masyvą su eilute (pavadinimu) ir skaičiumi (amžius) fiksuotoje pozicijoje:
type Person = (string, number);
Pagrindinis įrašo tipo naudojimas
The Record
tipas yra paprastas ir efektyvus būdas susieti raktus su reikšmėmis. Tai ypač naudinga, kai reikia apibrėžti objektus su konkrečiomis raktų ir reikšmių poromis, kai raktai yra tam tikro tipo, o reikšmės yra kito tipo.
Štai keletas pagrindinių būdų, kaip naudoti Record
tipo, kad apibrėžtumėte ir sukurtumėte struktūrinius duomenis.
Įrašo apibrėžimas
Norėdami apibrėžti a Record
nurodome raktų ir reikšmių tipus. Toliau pateiktame pavyzdyje apibrėžiamas objektas, kuriame kiekvienas raktas yra eilutė, o kiekviena reikšmė taip pat yra eilutė. Tai gali būti naudojama bendram vartotojo duomenų žemėlapiui:
type User = Record<string, string>;
Kuriant a Record
Tipo pavyzdys
Kai kurios svetainės turi įvairius padomenius. Tarkime, kad kiekvienam iš šių padomenių reikia tam tikro lygio administratoriaus prieigos ir sukurkite a Record
tipas, skirtas skirtingiems administratoriaus vaidmenims ir atitinkamiems jų prieigos lygiams saugoti. Čia UserRoles
ir UserStatus
yra Record
tipai, kai klavišai yra tam tikros eilutės literalai (admin
, blogAdmin
, docsAdmin
, active
, inactive
, suspended
), o reikšmės yra eilutės, apibūdinančios kiekvieną vaidmenį ir būseną.
Pirmiausia apibrėžiame a Record
tipo UserRoles
su specifiniais administratoriaus vaidmenimis kaip raktais ir jų aprašymais kaip vertybėmis. The UserRoles
tipas užtikrina, kad bet kuris tokio tipo objektas turės raktus admin
, blogAdmin
ir docsAdmin
su eilutės reikšmėmis, apibūdinančiomis kiekvieną vaidmenį. The roles
objektas atitinka šį tipą, pateikdamas kiekvieno administratoriaus vaidmens aprašymus:
type UserRoles = Record<'admin' | 'blogAdmin' | 'docsAdmin', string>;
const roles: UserRoles = {
admin: 'General Administrator with access to all areas.',
blogAdmin: 'Administrator with access to blog content.',
docsAdmin: 'Administrator with access to documentation.'
};
Toliau apibrėžiame a Record
tipo UserStatus
su konkrečiomis būsenomis kaip raktais ir jų aprašymais kaip reikšmėmis. The UserStatus
tipas užtikrina, kad bet kuris tokio tipo objektas turės raktus active
, inactive
ir suspended
su eilutės reikšmėmis, apibūdinančiomis kiekvieną būseną. The userStatus
objektas atitinka šį tipą, pateikdamas kiekvienos būsenos aprašus:
type UserStatus = Record<'active' | 'inactive' | 'suspended', string>;
const userStatus: UserStatus = {
active: 'User is currently active and can use all features.',
inactive: 'User is currently inactive and cannot access their account.',
suspended: 'User account is suspended due to policy violations.'
};
Kurdamas Record
Tokiu būdu užtikriname, kad administratoriaus vaidmenys ir vartotojo būsenos būtų gerai apibrėžti ir nuoseklūs visoje programoje.
Praktiniai įrašo tipo naudojimo atvejai
Šiame skyriuje apžvelgsime kelis praktinio naudojimo atvejus Record
tipą, kad parodytų jo universalumą ir efektyvumą įvairiuose scenarijuose.
1 naudojimo atvejis: visiško atvejo tvarkymo vykdymas
Naudojant Record
Norėdami apibrėžti atvejo reikšmių ir pranešimų susiejimą, kiekvieną galimą atvejį galime tvarkyti aiškiai. Taip užtikrinama, kad visi atvejai būtų padengti ir dėl bet kokių trūkstamų atvejų bus kompiliavimo laiko klaidų.
Toliau pateiktame pavyzdyje statusMessages
yra a Record
kur klavišai yra specifiniai Status
vertės ('pending'
, 'completed'
, 'failed'
), ir kiekvienas klavišas susiejamas su atitinkamu pranešimu. The getStatusMessage
funkcija naudoja šį įrašą, kad grąžintų atitinkamą pranešimą, pagrįstą status
parametras. Šis metodas garantuoja, kad visos būsenos yra tvarkomos teisingai ir nuosekliai.
Pavyzdys:
type Status = 'pending' | 'completed' | 'failed';
interface StatusInfo {
message: string;
severity: 'low' | 'medium' | 'high';
retryable: boolean;
}
const statusMessages: Record<Status, StatusInfo> = {
pending: {
message: 'Your request is pending.',
severity: 'medium',
retryable: true,
},
completed: {
message: 'Your request has been completed.',
severity: 'low',
retryable: false,
},
failed: {
message: 'Your request has failed.',
severity: 'high',
retryable: true,
},
};
function getStatusMessage(status: Status): string {
const info = statusMessages(status);
return `${info.message} Severity: ${info.severity}, Retryable: ${info.retryable}`;
}
console.log(getStatusMessage('completed'));
2 naudojimo atvejis: tipo tikrinimo įvedimas programose naudojant generikus
„TypeScript“ bendrieji elementai leidžia lanksčiai ir pakartotinai naudoti kodą. Kai derinama su Record
bendrieji vaistai gali padėti atlikti tipo tikrinimą ir užtikrinti, kad objektai atitiktų konkrečias struktūras.
Naudojant generinius vaistus su Record
galime sukurti funkcijas ar priemones, kurios generuoja objektus su konkrečiu raktų rinkiniu ir nuosekliu vertės tipu. Šis metodas padidina tipų saugą ir pakartotinį naudojimą mūsų kodų bazėje.
Toliau pateiktame pavyzdyje createRecord
funkcija paima raktų masyvą ir reikšmę ir grąžina a Record
kur kiekvienas raktas atitinka pateiktą vertę. Ši funkcija naudoja bendruosius žodžius (K
raktams ir T
vertės tipui), kad būtų užtikrinta, jog gauta Record
turi teisingą struktūrą.
Pavyzdys:
function createRecord<K extends string, T>(keys: K(), value: T): Record<K, T> {
const record: Partial<Record<K, T>> = {};
keys.forEach(key => record(key) = value);
return record as Record<K, T>;
}
interface RoleInfo {
description: string;
permissions: string();
}
const userRoles = createRecord(('admin', 'editor', 'viewer'), {
description: 'Default role',
permissions: ('read'),
});
console.log(userRoles);
3 naudojimo atvejis: Enums susiejimas su duomenimis
Naudojant Record
enums susiejimas su duomenimis leidžia sukurti paieškos lentelę, kurioje kiekviena sąrašo reikšmė susieta su konkrečia informacija. Tai ypač naudinga tokiais atvejais, kaip konfigūruoti nustatymus pagal enum reikšmes.
Šiame pavyzdyje colorHex
yra a Record
kad žemėlapiai kiekvieną Color
enum reikšmę į atitinkamą šešioliktainį spalvos kodą. Šis metodas suteikia aiškų ir tipo saugų būdą tvarkyti su spalvomis susijusius duomenis, pagrįstus sąrašo reikšmėmis.
Pavyzdys:
enum Color {
Red = 'RED',
Green = 'GREEN',
Blue = 'BLUE',
Yellow = 'YELLOW'
}
interface ColorInfo {
hex: string;
rgb: string;
complementary: string;
}
const colorHex: Record<Color, ColorInfo> = {
(Color.Red): {
hex: '#FF0000',
rgb: 'rgb(255, 0, 0)',
complementary: '#00FFFF',
},
(Color.Green): {
hex: '#00FF00',
rgb: 'rgb(0, 255, 0)',
complementary: '#FF00FF',
},
(Color.Blue): {
hex: '#0000FF',
rgb: 'rgb(0, 0, 255)',
complementary: '#FFFF00',
},
(Color.Yellow): {
hex: '#FFFF00',
rgb: 'rgb(255, 255, 0)',
complementary: '#0000FF',
},
};
console.log(colorHex(Color.Green));
4 naudojimo atvejis: peržvalgos lentelių kūrimas
Peržvalgos lentelė naudojant Record
padeda susieti raktus (pvz., identifikatorius, pavadinimus) su konkrečiomis reikšmėmis (pvz., aprašymais, kodais). Tai gali būti naudinga įvairioms programoms, įskaitant konfigūracijas, vertimus ir daugelį kitų dalykų.
Čia countryCode
yra a Record
kuri susieja šalių kodus su atitinkamų šalių pavadinimais, gyventojais, sostinėmis ir žemynais. Ši paieškos lentelė leidžia greitai ir saugiai pagal tipą gauti šalių pavadinimus ir populiacijas pagal šalių kodus.
Pavyzdys:
type CountryCode = "US" | "CA" | "MX" | "JP";
interface CountryInfo {
name: string;
population: number;
capital: string;
continent: string;
}
const countryLookup: Record<CountryCode, CountryInfo> = {
US: {
name: "United States",
population: 331000000,
capital: "Washington D.C.",
continent: "North America",
},
CA: {
name: "Canada",
population: 37700000,
capital: "Ottawa",
continent: "North America",
},
MX: {
name: "Mexico",
population: 128000000,
capital: "Mexico City",
continent: "North America",
},
JP: {
name: "Japan",
population: 126300000,
capital: "Tokyo",
continent: "Asia",
},
};
console.log(countryLookup.US);
console.log(countryLookup.US.population);
Iteravimas baigtas Record
Tipai
Kartojimas baigtas Record
tipai yra svarbūs norint pasiekti duomenis ir juos manipuliuoti duomenų struktūrose. Sukurkime pavyzdinius duomenis ir parodykime įvairius metodus, kaip galime kartoti „TypeScript“. Record
tipai.
Duomenų pavyzdžiai:
interface Course {
professor: string;
credits: number;
students: string();
}
interface Courses {
(key: string): Course;
}
const courses: Courses = {
Math101: {
professor: "Dr. Eze",
credits: 3,
students: ("Emmanuel", "Bob", "Charlie"),
},
History201: {
professor: "Dr. Jones",
credits: 4,
students: ("Dave", "Eve"),
},
};
Naudojant forEach
. Norėdami naudoti forEach
su a Record
konvertuokite jį į rakto-reikšmių porų masyvą:
Object.entries(courses).forEach(((key, value)) => {
console.log(`${key}: ${value.professor}, ${value.credits}`);
value.students.forEach(student => {
console.log(`Student: ${student}`);
});
});
Naudojant for...in
. The for...in
ciklas kartojasi per a klavišus Record
:
for (const key in courses) {
if (courses.hasOwnProperty(key)) {
const course = courses(key);
console.log(`${key}: ${course.professor}, ${course.credits}`);
course.students.forEach(student => {
console.log(`Student: ${student}`);
});
}
}
Naudojant Object.keys()
. Object.keys()
grąžina masyvą Record
raktai:
Object.keys(courses).forEach((key) => {
const course = courses(key);
console.log(`${key}: ${course.professor}, ${course.credits}`);
course.students.forEach(student => {
console.log(`Student: ${student}`);
});
});
Naudojant Object.values()
. Object.values()
grąžina masyvą Record
vertybės:
Object.values(courses).forEach((course) => {
console.log(`${course.professor}, ${course.credits}`);
course.students.forEach(student => {
console.log(`Student: ${student}`);
});
});
Išplėstiniai naudojimo ir naudingumo tipai su Record
The Record
tipas gali būti derinamas su kitais komunalinių paslaugų tipais, kad būtų pasiektas didesnis lankstumas ir tipo saugumas. Šiame skyriuje pateikiami išplėstiniai naudojimo modeliai ir parodoma, kaip tai padaryti Record
gali dirbti su tokiais paslaugų tipais kaip Pick
, Readonly
ir Partial
.
Sujungimas Record
su Pick
atrankinio tipo atvaizdavimui
The Pick
naudingumo tipas leidžia sukurti naują tipą, pasirenkant konkrečias ypatybes iš esamo tipo. Tai naudinga, kai norime dirbti tik su didesnio tipo savybių poaibiu.
Čia mes sukūrėme naują tipą SelectedProductInfo
renkantis tik name
ir price
savybės iš ProductInfo
sąsaja, tada naudokite Record
norėdami priskirti skirtingus produktus šiam naujam tipui:
interface ProductInfo {
name: string;
price: number;
category: string;
}
type SelectedProductInfo = Pick<ProductInfo, "name" | "price">;
type Product = 'Laptop' | 'Smartphone' | 'Tablet';
const products: Record<Product, SelectedProductInfo> = {
"Laptop": { name: "Dell XPS 15", price: 1500 },
"Smartphone": { name: "iPhone 12", price: 999 },
"Tablet": { name: "iPad Pro", price: 799 }
};
Sujungimas Record
su Readonly
Nekintamoms savybėms
The Readonly
naudingumo tipas užtikrina, kad ypatybės negalėtų būti pakeistos jas nustačius. Tai naudinga kuriant nekintamas duomenų struktūras.
The ReadonlyProductInfo
Įveskite toliau pateiktame pavyzdyje visas savybes ProductInfo
nekintamas, užtikrinant, kad kiekvieno produkto detalės negalėtų būti pakeistos, kai jos bus apibrėžtos:
type ReadonlyProductInfo = Readonly<ProductInfo>;
const readonlyProducts: Record<Product, ReadonlyProductInfo> = {
"Laptop": { name: "Dell XPS 15", price: 1500, category: "Electronics" },
"Smartphone": { name: "iPhone 12", price: 999, category: "Electronics" },
"Tablet": { name: "iPad Pro", price: 799, category: "Electronics" }
};
Sujungimas Record
su Partial
pasirenkamosioms savybėms
The Partial
naudingumo tipas padaro visas tipo savybes neprivalomas. Tai naudinga scenarijuose, kai ne visos savybės gali būti žinomos arba reikalingos vienu metu.
Čia, PartialProductInfo
tipas leidžia mums sukurti produktus, turinčius kai kurias arba nė viena iš nurodytų savybių ProductInfo
suteikiant lankstumo, kaip nurodoma produkto informacija:
type PartialProductInfo = Partial<ProductInfo>;
const partialProducts: Record<Product, PartialProductInfo> = {
"Laptop": { name: "Dell XPS 15" },
"Smartphone": { price: 999 },
"Tablet": {}
};
Sujungimas Record
su Record
skirtas įdėtajam žemėlapiui
Kitas pažangus naudojimas apima derinimą Record
tipai, kad būtų sukurti įdėtieji atvaizdai, kurie gali būti ypač naudingi tvarkant sudėtingas duomenų struktūras.
Šiame pavyzdyje storeInventory
naudoja įdėtą Record
tipus, norėdami susieti skyrius su atitinkamais produktais ir informacija, parodydami, kaip tai padaryti Record
Galima derinti sudėtingesniam duomenų valdymui:
type Department = 'Electronics' | 'Furniture';
type ProductDetails = Record<Product, ProductInfo>;
const storeInventory: Record<Department, ProductDetails> = {
"Electronics": {
"Laptop": { name: "Dell XPS 15", price: 1500, category: "Electronics" },
"Smartphone": { name: "iPhone 12", price: 999, category: "Electronics" },
"Tablet": { name: "iPad Pro", price: 799, category: "Electronics" }
},
"Furniture": {
"Chair": { name: "Office Chair", price: 200, category: "Furniture" },
"Table": { name: "Dining Table", price: 500, category: "Furniture" },
"Sofa": { name: "Living Room Sofa", price: 800, category: "Furniture" }
}
};
Išvada
The Record
tipas yra universalus įrankis objektų tipams valdyti ir struktūrizuoti, nes jis leidžia mums apibrėžti aiškius raktų ir reikšmių susiejimus, užtikrinant tipo saugumą ir nuoseklumą mūsų kode.
Norėdami gauti išsamesnės informacijos, žr. „TypeScript“ dokumentaciją ir peržiūrėkite kitus papildomus išteklius, pvz., „Total TypeScript“ ir „TypeScript“ mokymo programą, kad geriau suprastumėte „TypeScript“. Record
tipo sistema.