Suggest an editImprove this articleRefine the answer for “Type assertion (as)”. Your changes go to moderation before they’re published.Approval requiredContentWhat you’re changing🇺🇸EN🇺🇦UAPreviewTitle (EN)Short answer (EN)**`as`** is the type assertion operator: it tells the compiler "I am sure this value has the specified type, just trust me," without actually checking it. **Key point:** overusing `as` disables TypeScript's type safety and can hide real errors that only surface at runtime.Shown above the full answer for quick recall.Answer (EN)Image## What `as` does The `as` operator tells the compiler: > "I am **sure** this object has the specified type - just trust me." Example: ```javascript const value: unknown = "hello"; const length = (value as string).length; // asserting that value is a string ``` Sometimes this is useful when TypeScript cannot infer the type on its own. ## Why overusing `as` is an anti-pattern The problem is that `as` **disables type safety**. If you use it too often, you effectively **give up type checking**, and TypeScript turns into plain JavaScript with nice syntax highlighting. ## 1. `as` can hide real errors ```javascript type User = { name: string; age: number }; const data = { name: "Tim" } as User; // No error here console.log(data.age + 1); // Runtime error: age is undefined ``` Here TypeScript *took your word for it*, even though the object **does not match the type** `User`. Without `as`, the compiler would have warned: > Property 'age' is missing in type '{ name: string }' but required in type 'User'. ## 2. Breaking the real data structure ```javascript interface Animal { sound: string } interface Car { wheels: number } const myCar = { wheels: 4 } as Animal; // tricking the compiler console.log(myCar.sound.toUpperCase()); // runtime error ``` > `as` just made the compiler believe the object is an Animal, > when it is really a car with no `sound` field. ## 3. The type system loses its meaning If you abuse `as`, TypeScript stops doing its main job - **preventing errors before the code runs.** An example from a real project: ```javascript (fetchData() as any).map(...) ``` This code compiles, but it can cause a runtime error if `fetchData()` returns `null`, `object`, or anything else. ## 4. `as` is often used because of poor type design When a developer does not want to deal with types properly, they write: ```javascript (someValue as any).doSomething(); ``` Instead of: narrowing the variable's type, adding a generic, using a type guard (`if ("prop" in value)`), or specifying the function's return type. TypeScript deliberately requires you to **narrow** types so the code is more reliable, and `as` bypasses that rule. ## 5. "Double assertion" (`as unknown as T`) is especially dangerous ```javascript const user = { name: "Tim" } as unknown as number; // Nonsense, but TS does not complain ``` > This is called the **double casting hack**: > you convert a value to `unknown`, then to any type you want. > TypeScript stops protecting you. ## When `as` is actually justified Using `as` is acceptable in **rare, controlled situations**: ### 1. DOM manipulation: ```javascript const input = document.querySelector("input") as HTMLInputElement; input.value = "Hello"; ``` TypeScript does not know the exact type of the element, but you do. ### 2. Working with generic functions and JSON: ```javascript const data = JSON.parse('{"id":1,"name":"Tim"}') as { id: number; name: string }; ``` The compiler cannot infer the type from a string. ### 3. In libraries/frameworks with dynamic typing (React refs, Zustand store): ```javascript const ref = useRef() as React.MutableRefObject<HTMLDivElement | null>; ``` > The main thing is to **understand why the type is not inferred**, > and to apply `as` deliberately, not as a "patch". ## How to avoid overusing `as` | Problem | Use instead of `as` | |---|---| | TypeScript does not know the type | Narrow the variable's type at declaration | | Runtime type checking is needed | Use **type guards** (`typeof`, `instanceof`, `"key" in obj`) | | The type is too broad (`unknown`, `any`) | Extend the interface or add a generic | | A temporary check is needed | Use `satisfies` (TS 4.9+) | ### Example: `satisfies` instead of `as` ```javascript const user = { name: "Tim", age: 25, } satisfies { name: string; age: number }; ``` > Checks the type at compile time > Does not change the value's type > Safer than `as` ## SUMMARY | Pros of `as` | Cons when overused | |---|---| | Helps when TS cannot infer the type | Disables type checks | | Useful in specific cases (DOM, JSON) | Masks errors and breaks safety | | A quick "crutch" when migrating to TS | Turns the code back into "unchecked JS" | | Can be combined with `satisfies` | Double casting (`as unknown as T`) is dangerous |For the reviewerNote to the moderator (optional)Visible only to the moderator. Helps review go faster.