Why advanced types are needed in Typescript - Performance Analysis
When we use advanced types in TypeScript, it can affect how long the program takes to check types before running.
We want to know how the time to check types grows as the code gets more complex.
Analyze the time complexity of the following TypeScript type checks.
type Flatten = T extends any[] ? Flatten : T;
type NestedArray = number | NestedArray[];
// Using Flatten to get the base type from nested arrays
type Result = Flatten;
This code defines a type that unwraps nested arrays to find the base type inside.
Look at what repeats during type checking.
- Primary operation: Recursive type evaluation on nested arrays.
- How many times: Once for each level of nesting in the array type.
As the nesting depth increases, the type checker repeats the same operation more times.
| Input Size (nesting depth) | Approx. Operations |
|---|---|
| 1 | 1 |
| 5 | 5 |
| 10 | 10 |
Pattern observation: The time grows linearly with the depth of nested types.
Time Complexity: O(n)
This means the time to check types grows in a straight line as the nesting gets deeper.
[X] Wrong: "Advanced types always run instantly regardless of complexity."
[OK] Correct: Recursive or complex types make the checker work harder, so time grows with complexity.
Understanding how advanced types affect checking time helps you write clear and efficient code, a skill valued in real projects and interviews.
"What if we changed the recursive type to a non-recursive one? How would the time complexity change?"
Practice
Solution
Step 1: Understand the purpose of advanced types
Advanced types help describe complex data structures and relationships in code.Step 2: Recognize their benefit in error checking
They allow TypeScript to catch mistakes before running the code by checking data shapes.Final Answer:
To describe complex data shapes clearly and catch errors early -> Option CQuick Check:
Advanced types = clear data + early error catch [OK]
- Thinking advanced types speed up runtime
- Believing they remove the need for any types
- Confusing advanced types with JavaScript features
Solution
Step 1: Recall union type syntax
Union types use the pipe symbol | to allow multiple types.Step 2: Check each option
let value: string | number; uses | correctly; B uses & which means intersection, not union; C and D use invalid syntax.Final Answer:
let value: string | number; -> Option AQuick Check:
Union type uses | symbol [OK]
- Using & instead of | for union types
- Writing 'or' instead of |
- Separating types with commas
type Result = string | number;
function format(value: Result) {
if (typeof value === 'string') {
return value.toUpperCase();
} else {
return value.toFixed(2);
}
}
console.log(format(3.14159));
Solution
Step 1: Understand the function behavior
If the input is a string, it converts to uppercase. Otherwise, it formats the number to 2 decimals using toFixed(2).Step 2: Apply the function to 3.14159
3.14159 is a number, so toFixed(2) returns the string "3.14" with two decimals.Final Answer:
"3.14" (string) with two decimals -> Option DQuick Check:
Number input uses toFixed(2) = "3.14" [OK]
- Thinking toFixed returns a number, not string
- Confusing string input with number input
- Ignoring type narrowing in if statement
type User = { name: string; age: number } | null;
function greet(user: User) {
console.log("Hello, " + user.name.toUpperCase());
}Solution
Step 1: Analyze the User type
User can be an object or null, so user might be null at runtime.Step 2: Check the function usage
Accessing user.name without checking if user is null causes a runtime error.Final Answer:
user can be null, so accessing user.name causes an error -> Option AQuick Check:
Null union requires null check before property access [OK]
- Ignoring null possibility in union types
- Assuming string methods work on null
- Thinking missing return type causes error here
Solution
Step 1: Understand the parameter type
The parameter can be a string or an array of strings, so union type string | string[] is correct.Step 2: Handle both cases safely
Use Array.isArray to check if input is array, then join with commas; else return the string as is.Final Answer:
function joinStrings(input: string | string[]) { return Array.isArray(input) ? input.join(",") : input; } -> Option BQuick Check:
Use union type + type guard for safe handling [OK]
- Using intersection type & instead of union |
- Calling join on string without checking type
- Ignoring the string input case
Ready to prove it?
Pass the test and this pattern moves unknown
