Как расширить тип внутри интерфейса TypeScript?

В TypeScript есть несколько способов расширить тип внутри интерфейса. Рассмотрим их подробнее.

1. Использование наследования интерфейсов:
Можно создать новый интерфейс, который расширяет другой интерфейс при помощи ключевого слова extends. Например:

   interface Person {
     name: string;
     age: number;
   }

   interface Employee extends Person {
     employeeId: number;
     department: string;
   }

   const employee: Employee = {
     name: "John",
     age: 30,
     employeeId: 12345,
     department: "IT"
   };

В данном примере интерфейс Employee расширяет интерфейс Person, добавляя два дополнительных свойства employeeId и department. Теперь объект employee должен соответствовать интерфейсу Employee.

2. Использование объединения типов:
TypeScript позволяет объединять типы с помощью оператора |. Например:

   interface Vehicle {
     type: "car" | "bike";
     color: string;
   }

   const vehicle: Vehicle = {
     type: "car",
     color: "red"
   };

В данном примере тип type может быть либо "car", либо "bike". Объект vehicle должен иметь свойства type и color, где type может быть только одним из допустимых значений.

3. Использование условного типа:
TypeScript предоставляет возможность использовать условные типы для создания динамического расширения типа. Это достигается путем использования ключевых слов extends и infer. Например:

   interface Person {
     name: string;
     age: number;
     department: string;
   }

   type Employee<T> = T extends Person ? { employeeId: number } : never;

   const employee: Employee<Person> = {
     name: "John",
     age: 30,
     department: "IT",
     employeeId: 12345
   };

В данном примере мы использовали условный тип Employee<T>, который расширяет тип T. Если T соответствует типу Person, то возвращается объект с добавленным свойством employeeId. В противном случае возвращается тип never.

В зависимости от вашего конкретного случая, вы можете выбрать один из этих способов или комбинировать их вместе для достижения требуемого расширенного типа.