Module 2: Basic Types
TypeScript provides a rich set of built-in types that extend JavaScript. This module covers all fundamental types you'll use daily.
1. Primitive Types
String
let fullName: string = "John Doe";
let greeting: string = `Hello, ${fullName}`;
let multiLine: string = `
This is a
multi-line string
`;
Number
let age: number = 25;
let price: number = 99.99;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
Boolean
let isActive: boolean = true;
let hasPermission: boolean = false;
let isValid: boolean = age > 18;
TypeScript can often infer types automatically:
let name = "Alice"; // TypeScript infers string
2. Array Types
Method 1: Type[]
let numbers: number[] = [1, 2, 3, 4, 5];
let names: string[] = ["Alice", "Bob", "Charlie"];
let flags: boolean[] = [true, false, true];
Method 2: Array<Type>
let scores: Array<number> = [90, 85, 95];
let tags: Array<string> = ["typescript", "javascript"];
Prefer Type[] syntax for simple arrays. Use Array<Type> for complex generic types.
3. Tuple Types
Tuples are fixed-length arrays with known types for each position.
// Define a tuple
let person: [string, number];
person = ["Alice", 25]; // ✅ Correct
person = [25, "Alice"]; // ❌ Error: Type mismatch
// Accessing tuple elements
let name: string = person[0];
let age: number = person[1];
// Destructuring tuples
let [userName, userAge] = person;
Tuple with Optional Elements
let point: [number, number, number?] = [10, 20];
point = [10, 20, 30]; // Also valid
Tuple with Rest Elements
let data: [string, ...number[]] = ["scores", 90, 85, 95];
4. Enum Types
Enums define a set of named constants.
Numeric Enums
enum Direction {
Up, // 0
Down, // 1
Left, // 2
Right // 3
}
let move: Direction = Direction.Up;
console.log(move); // Output: 0
Enums with Custom Values
enum Status {
Active = 1,
Inactive = 0,
Pending = 2
}
let userStatus: Status = Status.Active;
String Enums
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
let favoriteColor: Color = Color.Red;
console.log(favoriteColor); // Output: "RED"
Const Enums (Performance Optimization)
const enum HttpStatus {
OK = 200,
NotFound = 404,
ServerError = 500
}
let status: HttpStatus = HttpStatus.OK;
// Compiled: let status = 200 (no enum object created)
5. Any Type
The any type disables type checking.
let variable: any = "Hello";
variable = 42; // ✅ OK
variable = true; // ✅ OK
variable.toFixed(); // ✅ No error (even if wrong)
Use any sparingly! It defeats the purpose of TypeScript.
When to Use Any
- Working with dynamic content (user input, APIs)
- Migrating JavaScript to TypeScript gradually
- Truly unknown data structures
6. Unknown Type
unknown is a type-safe alternative to any.
let value: unknown = "Hello";
// ❌ Cannot use directly
// value.toUpperCase(); // Error
// ✅ Must check type first
if (typeof value === "string") {
value.toUpperCase(); // OK
}
Unknown vs Any
| Type | Type Safety | Usage |
|---|---|---|
any | None | Disables type checking |
unknown | Full | Requires type checking before use |
Prefer unknown over any when the type is truly unknown.
7. Void Type
Used for functions that don't return a value.
function logMessage(message: string): void {
console.log(message);
}
function processData(): void {
// Do something but don't return
}
void is for function return types. Variables of type void can only be undefined or null.
8. Null and Undefined
let nothing: null = null;
let notDefined: undefined = undefined;
// With strictNullChecks enabled
let name: string = null; // ❌ Error
let age: number = undefined; // ❌ Error
// Allow null/undefined explicitly
let nullable: string | null = null; // ✅ OK
9. Never Type
Represents values that never occur.
Use Case 1: Functions That Never Return
function throwError(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {
// Never returns
}
}
Use Case 2: Exhaustive Type Checking
type Shape = "circle" | "square";
function getArea(shape: Shape): number {
switch (shape) {
case "circle":
return Math.PI * 10 * 10;
case "square":
return 10 * 10;
default:
const _exhaustive: never = shape;
return _exhaustive;
}
}
10. Object Type
let user: object = {
name: "Alice",
age: 25
};
// Better: Use specific object structure
let employee: { name: string; age: number; } = {
name: "Bob",
age: 30
};
11. Type Assertion (Type Casting)
Tell TypeScript to treat a value as a specific type.
Method 1: Angle Bracket Syntax
let value: any = "Hello TypeScript";
let length: number = (<string>value).length;
Method 2: as Syntax (Preferred in JSX)
let value: any = "Hello TypeScript";
let length: number = (value as string).length;
Type assertion doesn't perform runtime checks. You're telling TypeScript "trust me, I know what I'm doing."
12. Literal Types
Specify exact values a variable can hold.
String Literals
let direction: "up" | "down" | "left" | "right";
direction = "up"; // ✅ OK
direction = "north"; // ❌ Error
Numeric Literals
let diceRoll: 1 | 2 | 3 | 4 | 5 | 6;
diceRoll = 4; // ✅ OK
diceRoll = 7; // ❌ Error
Boolean Literals
let isTrue: true = true;
let isFalse: false = false;
13. Type Aliases
Create reusable type definitions.
type StringOrNumber = string | number;
type Point = { x: number; y: number; };
type Callback = (data: string) => void;
let value: StringOrNumber = "Hello";
let point: Point = { x: 10, y: 20 };
let handler: Callback = (data) => console.log(data);
Key Takeaways
✅ TypeScript has rich type system beyond JavaScript
✅ Use specific types instead of any
✅ Tuples for fixed-length, mixed-type arrays
✅ Enums for named constants
✅ Literal types for exact values
✅ Type assertions when you know better than TypeScript
Practice Exercises
Exercise 1: Type Annotations
Create variables with explicit types for your personal information.
let firstName: string = "Your Name";
let age: number = 25;
let isStudent: boolean = true;
Exercise 2: Arrays and Tuples
let scores: number[] = [90, 85, 95];
let user: [string, number, boolean] = ["Alice", 25, true];
Exercise 3: Enums
Create an enum for days of the week and use it.
enum DayOfWeek {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
let today: DayOfWeek = DayOfWeek.Monday;
Next Steps
In Module 3, we'll explore Functions in TypeScript including parameter types, return types, optional parameters, and function overloading.