Wcześniej pisałem już o typach pomocniczych w TypeScript takich jak Omit, Pick oraz Record, tym razem przyjrzymy się innym typom tego rodzaju - Partial, Exclude i Extract.
Typ Partial
Partial<T>
pozwala na stworzenie nowego typu, który zawiera te same właściwości co typ T, ale wszystkie właściwości
stają się opcjonalne (mogą mieć wartość undefined
).
type Person {
firstName: string
lastName: string
}
// Tworzenie typu częściowego na podstawie Person
type PartialPerson = Partial<Person>
const partialPerson: PartialPerson = {
firstName: "John"
}
W powyższym przykładzie typ PartialPerson
przyjmuje dwie właściwości, obie opcjonalne, więc przypisanie wartości tylko
do jednej z nich nie zwróci błędu.
Typ Exclude
Exclude<T, U>
tworzy nowy typ, który zawiera tylko te wartości z typu T, które nie są dostępne w typie U.
type Colors = "red" | "green" | "blue"
type ForbiddenColors = "green"
// Wykluczenie koloru "green" z AllowedColors
type UpdatedColors = Exclude<AllowedColors, ForbiddenColors>
const updatedColors: UpdatedColors = "red" // OK
const updatedColors2: UpdatedColors = "green"
// Błąd: Type '"green"' is not assignable to type 'UpdatedColors'.
Dzięki Exclude
z Colors
wykluczylismy typ ForbiddenColors
(“green”). Zmienna typowana jako UpdatedColors
może teraz przyjać dwie wartości - “red” lub “blue”.
Typ Extract
Extract<T, U>
tworzy nowy typ, który zawiera tylko te wartości z typu T, które są również dostępne w typie U.
type Fruits = "apple" | "banana" | "cherry"
type FavoriteFruits = "apple" | "banana"
// Wyodrębnienie ulubionych owoców z Fruits
type MyFavoriteFruits = Extract<Fruits, FavoriteFruits>
const myFruits: MyFavoriteFruits = "apple" // OK
const myFruits2: MyFavoriteFruits = "cherry"
// Błąd: Type '"cherry"' is not assignable to type 'MyFavoriteFruits'.
Działa to odwrotnie do Exclude
. W typie MyFavoriteFruits
wyodrębniliśmy wartości wspólne pomiędzy Fruits
i
FavoriteFruits
, więc typ ten równa się "apple" | "banana"
.
Te utility types są bardzo przydatne w TypeScript, ponieważ pozwalają na tworzenie bardziej elastycznych i precyzyjnych typów bez konieczności pisania dużej ilości kodu ręcznie.