Przejdź do głównej treści
eLearner.app
Moduł 2 · Lekcja 1 z 23/14 w kursie~12 min
Lekcje modułu (1/2)

Alias typu vs Interfejs

W TypeScript możemy definiować strukturę złożonych obiektów na dwa główne sposoby: za pomocą Interfejsów (interface) lub Aliasów Typów (type). Oba służą do opisywania "kształtu" obiektu lub struktury danych, lecz mają kilka kluczowych różnic.


Interfejsy (interface)

Interfejs definiuje kontrakt dla struktury obiektu. Jest standardowym narzędziem służącym do opisywania kształtu obiektów i API w sposób rozszerzalny.

TS
interface Book {
  title: string;
  pages: number;
  author?: string; // Proprietà opzionale (può essere omessa)
}

const myBook: Book = {
  title: 'Il Signore degli Anelli',
  pages: 1200,
};

Znak zapytania (?) oznacza właściwość jako opcjonalną. Obiekt myBook jest poprawny nawet wtedy, gdy pomija właściwość author.


Aliasy Typów (type)

Alias typu pozwala na przypisanie nowej nazwy do dowolnego istniejącego typu, w tym do typów prymitywnych, unii, krotek lub całych struktur obiektów.

TS
type Point = {
  x: number;
  y: number;
};

const coordinates: Point = { x: 10, y: 20 };

Kluczowe różnice: Rozszerzanie oraz Declaration Merging

Choć interface i type są w większości przypadków stosowane zamiennie, to mają dwie zasadnicze różnice:

1. Rozszerzalność (Dziedziczenie)

Interfejsy rozszerza się za pomocą słowa kluczowego extends:

TS
interface User {
  username: string;
}

interface Admin extends User {
  privileges: string[];
}

Aliasy typów nie mogą być rozszerzane za pomocą extends, lecz można je łączyć ze sobą za pomocą przecięcia / iloczynu typów (&):

TS
type User = {
  username: string;
};

type Admin = User & {
  privileges: string[];
};

2. Declaration Merging (Scalanie Deklaracji)

Wiele interfejsów o tej samej nazwie w tym samym zakresie (scope) jest automatycznie scalanych przez kompilator:

TS
interface User {
  name: string;
}
interface User {
  email: string;
}
// Ora User ha sia 'name' che 'email'!

To zachowanie nie jest obsługiwane przez aliasy typów: ponowne zadeklarowanie tej samej nazwy type wywoła błąd kompilacji.


Spróbuj sam

Ćwiczenie 1: Interfejs Użytkownik

Ćwiczenie#ts.m2.l1.e1
Próby: 0Ładowanie...

Zdefiniuj interfejs o nazwie User opisujący obiekt użytkownika. Interfejs powinien zawierać: id jako liczbę, username jako string oraz email jako opcjonalny string.

Ładowanie edytora...
Pokaż wskazówkę

Użyj składni email?: string, aby oznaczyć tę właściwość jako opcjonalną.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie 2: Alias typu Point2D

Ćwiczenie#ts.m2.l1.e2
Próby: 0Ładowanie...

Utwórz alias typu o nazwie Point2D reprezentujący punkt dwuwymiarowy ze współrzędnymi x i y (obie będące liczbami).

Ładowanie edytora...
Pokaż wskazówkę

Użyj składni type Point2D = { x: number; y: number; };

Rozwiązanie dostępne po 3 próbach

Ćwiczenie 3: Rozszerzanie Interfejsów

Ćwiczenie#ts.m2.l1.e3
Próby: 0Ładowanie...

Zdefiniuj interfejs o nazwie Product zawierający id (liczba) oraz price (liczba). Następnie zdefiniuj interfejs o nazwie DiscountedProduct, który rozszerza Product i dodaje opcjonalną właściwość o nazwie discountCode (string).

Ładowanie edytora...
Pokaż wskazówkę

Użyj extends Product, aby odziedziczyć pola, i dodaj discountCode?: string.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie 4: Konfiguracja Serwera

Ćwiczenie#ts.m2.l1.e4
Próby: 0Ładowanie...

Zdefiniuj alias typu o nazwie ServerConfig reprezentujący obiekt konfiguracji dla serwera. Powinien zawierać: host (string), port (liczba) oraz useHttps jako opcjonalne pole logiczne (boolean).

Ładowanie edytora...
Pokaż wskazówkę

Użyj składni type ServerConfig = { host: string; port: number; useHttps?: boolean; }.

Rozwiązanie dostępne po 3 próbach