Menu

Type alias w TypeScript: słowo kluczowe type z przykładami

Alias typu nadaje nazwę dowolnemu typowi za pomocą słowa kluczowego type: kształtom obiektów, uniom, krotkom, funkcjom, typom generycznym i rekurencyjnym. Poznaj składnię, wygląd każdej formy i powód, dla którego alias to tylko nazwa, a nie nowy, osobny typ.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Alias typu nadaje typowi nazwę. Piszesz type Name = ... i od tej chwili Name można używać wszędzie tam, gdzie oczekiwany jest typ. W przeciwieństwie do interfejsu alias może nazywać zupełnie dowolny typ, nie tylko kształty obiektów.

Aliasy istnieją tylko w czasie kompilacji. Wyemitowany JavaScript nie zawiera żadnej z tych linii type.

Składnia

type Name = SomeType;
type Name<T> = SomeTypeUsing<T>;       // generic
export type Name = SomeType;           // exported from a module

Zwyczajowo nazwy zapisuje się w PascalCase. Po prawej stronie stoi dowolne wyrażenie typu, a alias może używać innych aliasów, także samego siebie (zobacz typy rekurencyjne niżej). Alias jest dostępny w całym zasięgu, w którym go zadeklarowano, nawet nad linią deklaracji, bo typy są sprawdzane w czasie kompilacji, a nie wykonywane po kolei jak const czy let.

Typy obiektów

Dla kształtu obiektu alias i interfejs zapisuje się niemal tak samo. Alias używa = i zwykle kończy się średnikiem.

Alias nie może używać extends, tę rolę pełni przecięcie &. Sprawdzanie nadmiarowych właściwości oraz właściwości opcjonalne i readonly działają dokładnie tak jak w interfejsach. To, którą z dwóch form wybrać dla kształtów obiektów, omawia strona interface vs type.

Unie, krotki i funkcje

To przypadki, które da się nazwać tylko aliasem, i główny powód istnienia type. Alias unii wymienia możliwe warianty, alias krotki ustala długość i typy elementów tablicy, a alias funkcji opisuje sygnaturę.

W scale parametry nie potrzebują adnotacji: typy dostarcza alias Transform. Składnię krotek omawia strona o krotkach, a zawężanie unii strona o typach unii.

Generyczne aliasy typów

Parametry typu sprawiają, że jeden alias działa dla wielu typów. Mogą mieć wartości domyślne, tak jak parametry funkcji.

Result<number> używa domyślnego E = string. Małe generyczne aliasy, takie jak type Nullable<T> = T | null albo type Dict<T> = Record<string, T>, są częste w prawdziwym kodzie. Wbudowane typy narzędziowe (Partial<T>, Pick<T, K>, ReturnType<F>) to też generyczne aliasy, zadeklarowane w bibliotece standardowej.

Aliasy to nazwy, a nie nowe typy

Alias nie tworzy odrębnego typu. To druga nazwa typu z prawej strony, a kompilator traktuje oba jako identyczne. Dwa aliasy string są w pełni wymienne:

To wypisuje cancelling u_42 bez żadnego błędu, a to właśnie ten błąd, przed którym alias nie chroni. Alias nadal pomaga czytelnikom (parametr typu OrderId mówi więcej niż string), ale jeśli pomylenie dwóch identyfikatorów ma być błędem kompilacji, użyj branded type, takiego jak string & { readonly __brand: "OrderId" }.

Rekurencyjne aliasy typów

Alias może odwoływać się do samego siebie i tak opisuje się drzewa, zagnieżdżone listy i JSON:

Alias Json odrzuca wartości, których JSON nie potrafi przedstawić: { when: new Date() } albo { f: undefined } przypisane do Json to błędy kompilacji (TS2322).

Typy z wartości: typeof

Gdy wartość już istnieje, możesz nazwać jej typ, zamiast go wypisywać. Operator typu typeof odczytuje typ zmiennej i łączy się z innymi operatorami:

const defaults = { retries: 3, verbose: false, level: "info" };

type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }

type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"

function start(port: number) {
  return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }

Wartość pozostaje jedynym źródłem prawdy: dodaj właściwość do defaults, a Options za nią podąży. Więcej na stronie o typeof.

Eksportowanie i importowanie aliasów

Aliasy eksportuje się i importuje tak jak wartości. import type jawnie mówi, że importowany jest tylko typ, więc import zawsze znika z wyjściowego JavaScriptu:

// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };

// main.ts
import type { Point, Shape } from "./shapes.js";

const p: Point = { x: 1, y: 2 };

Najczęściej zadawane pytania

Czym jest alias typu w TypeScript?

Alias typu to nazwa dla typu zadeklarowana słowem kluczowym type: type Point = { x: number; y: number }. Od tego miejsca Point można używać wszędzie tam, gdzie oczekiwany jest typ. Może nazywać dowolny typ: kształt obiektu, unię, krotkę, sygnaturę funkcji, typ prosty albo typ generyczny.

Czy alias typu tworzy nowy typ?

Nie. Alias to tylko inna nazwa istniejącego typu. Przy type UserId = string i type OrderId = string wartość UserId można przekazać tam, gdzie oczekiwany jest OrderId, bo oba to po prostu string. Żeby utworzyć typy, których nie da się zamieniać, użyj branded type.

Czy alias typu może odwoływać się do samego siebie?

Tak, o ile odwołanie do siebie jest zagnieżdżone w typie obiektu, tablicy albo krotce: type TreeNode = { value: number; children: TreeNode[] } i alias Json, który zawiera Json[], działają. Samo odwołanie, takie jak type Loop = Loop | string, to błąd TS2456, Type alias 'Loop' circularly references itself.

Czy alias typu może być generyczny?

Tak. Umieść parametry typu po nazwie: type Box<T> = { value: T }, a potem używaj go jako Box<number>. Parametry mogą mieć wartości domyślne (type Result<T, E = string> = ...) i ograniczenia (type Keys<T extends object> = keyof T).

Jak uzyskać typ z istniejącego obiektu?

Użyj operatora typu typeof: const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; daje { retries: number; verbose: boolean }. Dzięki temu masz jedno źródło prawdy, gdy najpierw powstaje wartość.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ