Kategoria: TypeScript

Partial, Exclude i Extract - typy pomocnicze w Typescript


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.