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.
Porównanie w tabeli
#Sprawdza zgodność z typem
- satisfies
- Tak
Typ wynikowej zmiennej
- Asercja typu (as)
- Podany typ (
Typ) - satisfies
- Typ wywnioskowany z wartości
Literówka lub brakujące pole
- Asercja typu (as)
- Nie zostanie zgłoszona
- satisfies
- Zostanie zgłoszona przez kompilator
Zachowuje literały i konkretne klucze
- satisfies
- Tak
Bezpieczeństwo
- Asercja typu (as)
- Niskie, łatwo oszukać kompilator
- satisfies
- Wysokie, kompilator nadal pilnuje kształtu
Typowe użycie
- Asercja typu (as)
- Element DOM, dane sprawdzone już wcześniej
- satisfies
- Obiekty konfiguracji, mapy kolorów, tras
Przykład
#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())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
#const a = wyrazenie as Typ
const b = wyrazenie satisfies TypWięcej przykładów
#type Config = { fontSize: number }
const wrong = { fontsize: 16 } as Config
console.log(wrong.fontSize)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.
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
asjako ostateczność, szczególnie przy danych z zewnątrz. Jeśli się da, sprawdź kształt strażnikiem typu. - Po
satisfieszmienna 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 Tto sygnał, że coś jest nie tak z typami.satisfiesnigdy nie wymaga takiego obejścia.
Powiązane hasła
#- Asercja typu (as)Wskazanie kompilatorowi typu wartości, gdy wiesz więcej niż on.
- satisfiesSprawdza, czy wartość pasuje do typu, nie zmieniając typu wywnioskowanego.
- as constZamraża literały w wyrażeniu: najwęższe typy i pola tylko do odczytu.
- unknownBezpieczny odpowiednik any: wartość nieznanego typu, której trzeba najpierw sprawdzić.
Widzisz błąd albo brakuje przykładu? Napisz do nas.