TypeScript Explicit & Inference
Understanding how TypeScript assigns types
🎯 Explicit vs Inference
TypeScript can determine types automatically (inference) or you can specify them manually (explicit). Explicit types use colon syntax, while inference lets TypeScript figure out types from assigned values automatically.
// Explicit type
let name: string = "Alice";
// Type inference
let age = 25; // TypeScript knows it's a number
Both work the same way:
name: "Alice" (string)
age: 25 (number)
Two Ways to Assign Types
Explicit Type
You write the type yourself
let score: number = 100;
let name: string = "Bob";
Type Inference
TypeScript figures it out
let score = 100; // number
let name = "Bob"; // string
🔹 Explicit Type Assignment
Explicitly declare types using the colon (:) syntax:
// Explicit type declarations
let firstName: string = "John";
let age: number = 30;
let isActive: boolean = true;
// Explicit types for functions
function greet(name: string): string {
return `Hello, ${name}!`;
}
console.log(greet("Alice"));
Output:
Hello, Alice!
🔹 Type Inference
TypeScript automatically infers types from values:
// TypeScript infers the types
let city = "New York"; // inferred as string
let population = 8000000; // inferred as number
let isCapital = false; // inferred as boolean
// Inference works with operations too
let total = 10 + 20; // inferred as number
let message = "Count: " + 5; // inferred as string
console.log(typeof city); // Output: string
console.log(typeof total); // Output: number
Output:
string
number
🔹 When to Use Each Approach
Both methods are valid, but each has its place:
✅ Use Explicit Types When:
- Declaring variables without initial values
- Function parameters and return types
- You want to be extra clear about intent
- Working with complex types
// Good use of explicit types
let userId: number; // No initial value
userId = 12345;
function calculate(x: number, y: number): number {
return x + y;
}
✅ Use Type Inference When:
- The type is obvious from the value
- Assigning values immediately
- Keeping code concise and readable
- Working with simple types
// Good use of inference
let count = 0; // Obviously a number
let name = "Alice"; // Obviously a string
let items = [1, 2, 3]; // Obviously number array
🔹 Inference with Functions
TypeScript can infer return types but not parameter types:
// Parameters need explicit types
// Return type is inferred
function add(a: number, b: number) {
return a + b; // TypeScript infers return type: number
}
// You can also be explicit about return type
function multiply(a: number, b: number): number {
return a * b;
}
console.log(add(5, 3)); // Output: 8
console.log(multiply(4, 2)); // Output: 8
Output:
8
8
🔹 Common Mistakes
Avoid these common pitfalls:
// ❌ Wrong: Unnecessary explicit type
let message: string = "Hello"; // Type is obvious
// ✅ Better: Use inference
let message = "Hello";
// ❌ Wrong: Missing parameter types
function greet(name) { // Error: Parameter 'name' implicitly has 'any' type
return `Hello ${name}`;
}
// ✅ Correct: Explicit parameter types
function greet(name: string) {
return `Hello ${name}`;
}
// ❌ Wrong: No initial value, no type
let userId; // Type: any (not recommended)
// ✅ Correct: Explicit type without value
let userId: number;
userId = 123;
🔹 Practical Example
Mixing explicit types and inference effectively:
// Function with explicit parameter types
function createUser(name: string, age: number, isAdmin: boolean) {
// Inference for local variables
let userId = Math.floor(Math.random() * 10000);
let createdAt = new Date();
return {
id: userId,
name: name,
age: age,
admin: isAdmin,
created: createdAt
};
}
let user = createUser("Alice", 28, false);
console.log(`User ${user.name} created with ID: ${user.id}`);
Output:
User Alice created with ID: 7342