PorównaniePorównania

as vs satisfies

as mówi kompilatorowi, żeby zaufał twojemu typowi i niczego nie sprawdzał, a satisfies sprawdza zgodność z typem i zachowuje dokładny typ wywnioskowany z wartości.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
TypeScript
type Palette = Record<string, string>

const broken = { accent: '#a78bfa' } as { accent: number }
console.log(typeof broken.accent)

const safe = { accent: '#a78bfa' } satisfies Palette
console.log(safe.accent.toUpperCase())
Wynik
string
#A78BFA

Definicja i zastosowanie

#

Obie składnie łączą wyrażenie z typem i obie piszesz po wartości: wartosc as Typ oraz wartosc satisfies Typ. W obu przypadkach nic się nie zmienia w działającym programie, bo to mechanizmy czasu kompilacji.

Różnica jest w tym, co robi kompilator. as niczego nie sprawdza: zamienia typ wyrażenia na podany, nawet jeśli wartość w ogóle do niego nie pasuje, a błąd wyjdzie dopiero w działaniu. satisfies sprawdza, że wartość pasuje do typu, i zgłosi błąd przy literówce albo brakującym polu, ale zostawia typ wywnioskowany z samej wartości, a nie z adnotacji. Dzięki temu po satisfies nadal widać dokładne literały i klucze obiektu, a po as tylko podany typ.

as zostaw na sytuacje, w których wiesz więcej niż kompilator, na przykład element DOM po querySelector. Tam, gdzie chcesz sprawdzenia kształtu obiektu konfiguracji, mapy kolorów czy tras, a jednocześnie precyzyjnych typów wartości, wybierz satisfies.

Składnia

#
Składnia
const a = wyrazenie as Typ
const b = wyrazenie satisfies Typ

Więcej przykładów

#
as przepuszcza literówkę w nazwie pola
TypeScript
type Config = { fontSize: number }

const wrong = { fontsize: 16 } as Config
console.log(wrong.fontSize)
Wynik
undefined

Literówka fontsize zamiast fontSize nie została zgłoszona, bo as tylko nadpisuje typ. W działającym programie pole fontSize po prostu nie istnieje.

satisfies zgłasza tę samą literówkę od razu
TypeScript
type Config = { fontSize: number }

const correct = { fontsize: 16 } satisfies Config
// Błąd: Object literal may only specify known properties, and 'fontsize' does not exist in type 'Config'.

Dobre praktyki

#
  • Traktuj as jako ostateczność, szczególnie przy danych z zewnątrz. Jeśli się da, sprawdź kształt strażnikiem typu.
  • Po satisfies zmienna ma typ wywnioskowany z wartości, a nie z adnotacji, więc podpowiedzi edytora pokazują dokładne klucze i literały.
  • Podwójna asercja as unknown as T to sygnał, że coś jest nie tak z typami. satisfies nigdy nie wymaga takiego obejścia.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.