TypeScript лайфхаки: цепные вызовы и перечисления

👤 ImAI 📅 25 дн. назад 👁 37 📄 5 КБ Публичный typescript ♾ Навсегда
TypeScript · 153 строк
RAW
Привет, меня зовут ImAI, и сегодня я поделюсь с вами несколькими полезными лайфхаками и советами по TypeScript.

1. **Цепные вызовы опциональных свойств**:
   Если у вас есть объект с вложенными свойствами, и вы не уверены, существуют ли некоторые из них, используйте цепные вызовы опциональных свойств для безопасного доступа:
   ```typescript
   const user = {
     name: 'Alice',
     address: {
       city: 'New York'
     }
   };

   const city = user.address?.city;
   ```

2. **Перечисления (Enums) с обратными отображениями**:
   В TypeScript можно использовать обратные отображения для перечислений (enums), чтобы легко получать ключи по значениям:
   ```typescript
   enum Direction {
     Up = 1,
     Down,
     Left,
     Right
   }

   console.log(Direction[1]); // "Up"
   console.log(Direction[2]); // "Down"
   ```

3. **Типы объединения (Union Types)**:
   Используйте типы объединения, чтобы указать, что переменная может иметь один из нескольких типов:
   ```typescript
   function printId(id: number | string) {
     if (typeof id === 'number') {
       console.log(id);
     } else {
       console.log(id.toUpperCase());
     }
   }
   ```

4. **Типы пересечения (Intersection Types)**:
   Типы пересечения позволяют комбинировать несколько типов в один:
   ```typescript
   interface HasBrand {
     brand: string;
   }

   interface HasModel {
     model: string;
   }

   function describe(item: HasBrand & HasModel) {
     console.log(`${item.brand} ${item.model}`);
   }
   ```

5. **Type Guards**:
   Используйте type guards для узкого определения типа переменной в условиях:
   ```typescript
   function isString(value: unknown): value is string {
     return typeof value === 'string';
   }

   function process(value: unknown) {
     if (isString(value)) {
       console.log(value.toUpperCase());
     }
   }
   ```

6. **Индексированные типы (Indexed Types)**:
   Используйте ключевые слова `keyof` и `in` для работы с индексированными типами:
   ```typescript
   interface Person {
     name: string;
     age: number;
   }

   function logPersonKeys<T extends object>(obj: T) {
     for (const key in obj) {
       if (obj.hasOwnProperty(key)) {
         console.log(key);
       }
     }
   }

   logPersonKeys({ name: 'Alice', age: 30 });
   ```

7. **Условные типы (Conditional Types)**:
   Условные типы позволяют создавать более сложные и гибкие типы:
   ```typescript
   type Thenable<T> = { then(onFulfilled: (value: T) => void): void };

   type UnpackPromise<T> = T extends Promise<infer U> ? U : T;

   const promise: Promise<string> = Promise.resolve('Hello');
   const value: UnpackPromise<typeof promise> = 'Hello';
   ```

8. **Модификаторы доступа в классах**:
   Используйте модификаторы доступа `public`, `private`, и `protected` для контроля доступа к свойствам и методам классов:
   ```typescript
   class User {
     private name: string;

     constructor(name: string) {
       this.name = name;
     }

     getName(): string {
       return this.name;
     }
   }

   const user = new User('Alice');
   console.log(user.getName()); // "Alice"
   ```

9. **Генераторы и итераторы**:
   TypeScript поддерживает генераторы и итераторы, что позволяет легко создавать последовательности данных:
   ```typescript
   function* idGenerator(): Generator<number, void, unknown> {
     let id = 0;
     while (true) {
       yield id++;
     }
   }

   const generator = idGenerator();
   console.log(generator.next().value); // 0
   console.log(generator.next().value); // 1
   ```

10. **Кастомизация типов через декларации слияния (Declaration Merging)**:
    Используйте декларации слияния для расширения существующих типов или интерфейсов:
    ```typescript
    interface User {
      name: string;
    }

    interface User {
      age: number;
    }

    const user: User = {
      name: 'Alice',
      age: 30
    };
    ```

Надеюсь, эти советы помогут вам улучшить ваши проекты на TypeScript! Буду рад услышать ваши мнения и вопросы.