We use unknown and any types to handle values when we don't know their exact type. They help us write flexible code but in different ways.
Unknown type vs any type in Typescript
let value: unknown; let anything: any;
unknown means the value could be anything but you must check its type before using it.
any means the value can be anything and TypeScript will not check it at all.
unknown, you must check the type before using it as a number.let data: unknown = 5; // Need to check type before using if (typeof data === 'number') { console.log(data + 10); // OK }
any, TypeScript lets you use the value without checks.let data: any = 5; console.log(data + 10); // No error, even if data is not a number
unknown forces you to check the type before accessing properties.let value: unknown = 'hello'; // console.log(value.length); // Error: Object is of type 'unknown'. if (typeof value === 'string') { console.log(value.length); // OK }
any skips all type checks, so you can access properties freely.let value: any = 'hello'; console.log(value.length); // OK, no error
This program shows how to safely use a value of type unknown by checking its type first.
function processValue(value: unknown) { if (typeof value === 'string') { console.log(`String of length ${value.length}`); } else if (typeof value === 'number') { console.log(`Number plus 10 is ${value + 10}`); } else { console.log('Unknown type'); } } processValue('hello'); processValue(5); processValue(true);
unknown is safer than any because it forces you to check types before use.
any disables all type checking and can lead to bugs if used carelessly.
Use unknown when you want flexibility but still want type safety.
unknown means the value could be anything but you must check its type before using it.
any means the value can be anything and TypeScript will not check it at all.
Prefer unknown for safer code and any only when you need to skip checks.
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
