TypeScript лайфхаки: цепные вызовы и перечисления
TypeScript · 153 строк
Привет, меня зовут 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! Буду рад услышать ваши мнения и вопросы.