Asercja typów mówi kompilatorowi "ufaj mi, ta wartość ma typ X" używając as. Nie wykonuje żadnej konwersji ani sprawdzania w czasie wykonywania — zmienia tylko sposób, w jaki kompilator traktuje wartość.
ts
el = .() ;
el. = ;
data = .(str) ;
Asercja typów mówi kompilatorowi "ufaj mi, ta wartość ma typ X" używając as. Nie wykonuje żadnej konwersji ani sprawdzania w czasie wykonywania — zmienia tylko sposób, w jaki kompilator traktuje wartość.
el = .() ;
el. = ;
data = .(str) ;
Asercja przesłania osąd kompilatora — jeśli się mylisz, otrzymujesz crash w czasie wykonywania bez ostrzeżenia:
const x = "hello" as unknown as number; // double assertion — compiler stops complaining
x.toFixed(2); // 💥 runtime error: x.toFixed is not a function
Asercja nie czyni wartości tego typu; po prostu wycisza kontrolę. Przejąłeś odpowiedzialność za poprawność od kompilatora.
// 1. type guard — actually verify at runtime
if (typeof input === "string") { /* input is string, proven */ }
// 2. validation library (zod) for external data
const user = UserSchema.parse(data); // throws if shape is wrong
as const jest inneconst point = { x: 1 } as const; // not a risky cast — narrows to literal/readonly
Asercje są czasami konieczne (API DOM, zawężanie unknown, które już sprawdziłeś), ale każda z nich to miejsce, w którym kompilator nie może Cię chronić.
Preferuj type guards lub walidację schematów dla niezaufanych danych i traktuj każde as jako małe, świadome "wiem lepiej", którym musisz być pewien.