7

Возможно ли расширять типы в TypeScript?

6

У меня есть следующий тип:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

Теперь я хочу расширить этот тип, то есть создать новый тип на его основе:

type UserEvent extends Event = {
   UserId: string; 
}

Однако эта конструкция не работает. Как я могу правильно расширить тип Event?

5 ответ(ов)

1

Вы можете пересекать типы в TypeScript следующим образом:

type TypeA = {
    nameA: string;
};
type TypeB = {
    nameB: string;
};
export type TypeC = TypeA & TypeB;

Теперь в вашем коде вы можете создать объект, который соответствует типу TypeC, следующим образом:

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};

Объединив типы TypeA и TypeB, вы создали новый тип TypeC, который требует наличие свойств как nameA, так и nameB.

0

Вы можете создать обобщённый тип расширения следующим образом:

type Extension<T> = T & { someExtensionProperty: string }

В данном примере мы определяем тип Extension, который принимает параметр типа T и добавляет к нему новое свойство someExtensionProperty типа string. Этот подход позволяет добавлять расширения к любому типу, сохраняя при этом типобезопасность.

0

Вы также можете сделать это, используя type в дополнение к interface:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

type UserEvent = {
   UserId: string; 
} & Event;

Таким образом, UserEvent становится объединением типов, в которое входят все свойства типа Event, а также добавляется свойство UserId. Это позволяет вам создавать более сложные структуры данных, сохраняя при этом типизацию.

0

Вы не можете наложить ограничение на алиас.

Это допустимо, хотя семантика некорректна:

type UserEvent /* extends Event */ = {
   UserId: string; 
}

Но это уже неправильно:

type UserEvent extends Event = {
   UserId: string; 
}

Чтобы правильно выразить то, что вы имеете в виду, вы можете использовать & Event вместо extends Event:

type UserEvent = { UserId: string } & Event;
0

Если у вас есть тип, определённый с помощью Union (то есть несколько возможных типов), и вы хотите добавить дополнительный тип, вы можете сделать это следующим образом:

interface TextInputProps { type: string; }
interface TextAreaProps { type: string | number; }

export type InputCompProps = TextInputProps | TextAreaProps;

Чтобы добавить новые свойства (или новый тип), например, с помощью интерфейса CustomProps, вы можете изменить определение типа следующим образом:

interface CustomProps { length: number; }
export type InputCompProps = (TextInputProps | TextAreaProps) & CustomProps;

Теперь InputCompProps будет представлять собой объединение существующих типов TextInputProps и TextAreaProps, в дополнение к новым свойствам из CustomProps. Таким образом, любой объект типа InputCompProps будет должен иметь как минимум одно из свойств TextInputProps или TextAreaProps, а также свойство length из CustomProps.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь