What if blindly trusting your data could break your whole app without warning?
Unknown type vs any type in Typescript - When to Use Which
Imagine you are sorting through a big box of mixed items without knowing what each item is. You try to use or fix them without checking, hoping everything works fine.
This approach is risky and slow because you might break something or waste time fixing errors caused by wrong assumptions. Without knowing what you have, mistakes happen often.
Using the unknown type in TypeScript forces you to check what you have before using it, making your code safer. Unlike any, which lets you do anything and can hide errors, unknown makes you pause and confirm, preventing bugs.
let data: any = fetchData(); console.log(data.name.toUpperCase());
let data: unknown = fetchData(); if (typeof data === 'object' && data !== null && 'name' in data) { console.log((data as { name: string }).name.toUpperCase()); }
This concept enables you to write safer programs that catch mistakes early by making you verify unknown data before using it.
When receiving user input or data from the internet, you don't know its shape. Using unknown helps you check the data carefully before trusting it, avoiding crashes or wrong results.
any lets you do anything but can hide errors.
unknown forces you to check before use, making code safer.
Using unknown helps catch bugs early and write more reliable programs.
Practice
unknown and any types in TypeScript?Solution
Step 1: Understand
unknownbehaviorunknownmeans the value can be anything, but you must check its type before using it to avoid errors.Step 2: Understand
anybehavioranydisables type checking, so you can use the value without checks, which can cause runtime errors.Final Answer:
unknownrequires type checking before use,anydoes not. -> Option AQuick Check:
unknown= safe,any= unchecked [OK]
- Thinking any is safer than unknown
- Assuming unknown allows direct use without checks
- Believing unknown and any behave the same
unknown to a variable of type string?Solution
Step 1: Understand assignment rules for unknown
You cannot assignunknowndirectly to a more specific type without a type assertion or check.Step 2: Check options for correct syntax
let a: unknown = "hello"; let b: string = a as string; uses a type assertionas string, which is the correct way to tell TypeScript the value is a string.Final Answer:
let b: string = a as string; -> Option AQuick Check:
Useasto convert unknown safely [OK]
- Assigning unknown directly without assertion
- Using incorrect type assertion syntax
- Calling methods on unknown without checks
let value: unknown = 42;
if (typeof value === 'number') {
console.log(value + 8);
} else {
console.log('Not a number');
}Solution
Step 1: Check the type of
The variablevaluevalueisunknownbut assigned 42, a number.Step 2: Evaluate the if condition and output
The conditiontypeof value === 'number'is true, so it logsvalue + 8which is 42 + 8 = 50.Final Answer:
50 -> Option CQuick Check:
Type check passes, output is 50 [OK]
- Assuming unknown can be used without type check
- Expecting runtime error without type check
- Confusing unknown with any behavior
let data: unknown = 'hello'; let length: number = data.length;
Solution
Step 1: Understand property access on unknown
You cannot access properties directly on a variable typed asunknownwithout type checking or assertion.Step 2: Identify the error message
Trying to accessdata.lengthcauses a compile-time error: "Cannot access property 'length' on type 'unknown'."Final Answer:
Cannot access property 'length' on type 'unknown'. -> Option BQuick Check:
Accessing unknown properties causes error [OK]
- Assuming unknown behaves like any
- Ignoring compiler error on property access
- Wrongly typing variables
any. You want to safely use it as a string only if it really is a string. Which approach is best?Solution
Step 1: Understand risks of
anyanydisables type checking, so using it directly can cause runtime errors if the data is not as expected.Step 2: Use type guard for safety
Checking the type with a type guard (e.g.,typeof data === 'string') ensures safe usage only when the data is a string.Final Answer:
Use a type guard to check if data is a string before using it. -> Option DQuick Check:
Type guard ensures safe use of any data [OK]
- Assigning any directly without checks
- Casting any to unknown then string without validation
- Ignoring type safety for external data
Ready to prove it?
Pass the test and this pattern moves unknown
