Szybka lekcja, poznajemy utility type Record oraz piszemy nasz pierwszy mapped type. Do dzieła.
Ok, przykład z dokumentacji:
type CatName = "miffy" | "boris" | "mordred";
interface CatInfo {
age: number;
breed: string;
}
const cats: Record<CatName, CatInfo> = {
miffy: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" },
mordred: { age: 16, breed: "British Shorthair" },
};
Czyli ma być union type, który zawiera wszystkie klucze, jakie ma mieć Record, oraz typ, jaki będzie wartością tych kluczy. Widzieliśmy już record w poprzedniej lekcji:
type Streams = 'salary' | 'bonus' | 'sidehustle'
type Incomes = Record<Streams, number>
// type Incomes = {
// salary: number;
// bonus: number;
// sidehustle: number;
// }
const monthlyIncomes: Incomes = {
salary: 500,
bonus: 100,
sidehustle: 250
}
for (const revenue in monthlyIncomes) {
console.log(monthlyIncomes[revenue as keyof Incomes])
}
Teraz pytanie, jak coś takiego napisać. Cóż, zacznijmy od zdefiniowania klucza i typu:
type MyRecord<K extends string|number|symbol, T> = {};
Klucz może być napisem, liczą lub symbolem, niczym innym. T to jakiś typ, jaki ma być przypisany do wartości tych kluczy.
Ok, to teraz musimy znaleźć jakąś składnię do przeiterowania po wszystkich kluczach, jakie zostaną podane i przypisania im typu T w obiekcie po prawej stronie:
type MyRecord<K extends string|number|symbol, T> = {
[P in K]: T;
};
Zwyczajowo to się P nazywa, od property. K od key (klucz), T od type. Czyli mają być properties takie jak w K, ich wartość to T.
Zobaczmy, czy MyRecord zadziała tak, jak wbudowany utility type Record:
type Streams = 'salary' | 'bonus' | 'sidehustle'
type MyRecord<K extends string|number|symbol, T> = {
[P in K]: T;
};
type Incomes = MyRecord<Streams, number>
// type Incomes = {
// salary: number;
// bonus: number;
// sidehustle: number;
// }
const monthlyIncomes: Incomes = {
salary: 500,
bonus: 100,
sidehustle: 250
}
for (const revenue in monthlyIncomes) {
console.log(monthlyIncomes[revenue as keyof Incomes])
}
Działa tak samo. Więcej TSa niedługo!