1// sample.ts
  2// A practical TypeScript tour in one file ๐Ÿš€
  3
  4// --------------------
  5// Basic Types
  6// --------------------
  7let username: string = "Alice";
  8let age: number = 30;
  9let isAdmin: boolean = false;
 10
 11let hobbies: string[] = ["gaming", "coding"];
 12let scores: Array<number> = [10, 20, 30];
 13
 14// Tuple
 15let userTuple: [string, number] = ["Bob", 42];
 16
 17// --------------------
 18// Enums
 19// --------------------
 20enum Role {
 21    User = "USER",
 22    Admin = "ADMIN",
 23    Moderator = "MODERATOR",
 24}
 25
 26// --------------------
 27// Interfaces & Types
 28// --------------------
 29interface User {
 30    id: number;
 31    name: string;
 32    role: Role;
 33    email?: string; // optional
 34}
 35
 36type ApiResponse<T> = {
 37    success: boolean;
 38    data: T;
 39    error?: string;
 40};
 41
 42// --------------------
 43// Functions
 44// --------------------
 45function greet(user: User): string {
 46    return `Hello, ${user.name}! Your role is ${user.role}.`;
 47}
 48
 49const add = (a: number, b: number): number => a + b;
 50
 51// Function with default value
 52function log(message: string, level: "info" | "warn" | "error" = "info") {
 53    console.log(`[${level.toUpperCase()}] ${message}`);
 54}
 55
 56// --------------------
 57// Classes
 58// --------------------
 59class UserService {
 60    private users: User[] = [];
 61
 62    constructor(initialUsers: User[] = []) {
 63        this.users = initialUsers;
 64    }
 65
 66    addUser(user: User): void {
 67        this.users.push(user);
 68    }
 69
 70    findByRole(role: Role): User[] {
 71        return this.users.filter(u => u.role === role);
 72    }
 73}
 74
 75// --------------------
 76// Generics
 77// --------------------
 78function wrapResponse<T>(data: T): ApiResponse<T> {
 79    return {
 80        success: true,
 81        data,
 82    };
 83}
 84
 85// --------------------
 86// Async / Await
 87// --------------------
 88async function fetchUser(id: number): Promise<User> {
 89    // Fake async call
 90    return new Promise(resolve => {
 91        setTimeout(() => {
 92            resolve({
 93                id,
 94                name: "Charlie",
 95                role: Role.User,
 96            });
 97        }, 500);
 98    });
 99}
100
101// --------------------
102// Type Narrowing
103// --------------------
104function printValue(value: string | number) {
105    if (typeof value === "string") {
106        console.log("String value:", value.toUpperCase());
107    } else {
108        console.log("Number value:", value.toFixed(2));
109    }
110}
111
112// --------------------
113// Usage Example
114// --------------------
115(async () => {
116    const user: User = {
117        id: 1,
118        name: username,
119        role: isAdmin ? Role.Admin : Role.User,
120    };
121
122    log(greet(user));
123
124    const service = new UserService([user]);
125    service.addUser({ id: 2, name: "Dana", role: Role.Admin });
126
127    console.log("Admins:", service.findByRole(Role.Admin));
128
129    const fetchedUser = await fetchUser(3);
130    const response = wrapResponse(fetchedUser);
131
132    console.log("API response:", response);
133
134    printValue("hello");
135    printValue(123.456);
136
137    console.log("2 + 3 =", add(2, 3));
138})();