Давайте на мгновение заменим implements
на extends
. Когда вы напишете
class CreateConversationDto extends CreateConvo {}
, это не только компилятор TS, но даже JS -двигатель, который не так сильно заботится о типах, будет действительно сбит с толку относительно того, что следует рассматривать как прототип для этого класса.
Теперь вернемся к implements
и представим, что такой тип можно создать. Но давайте добавим еще один уровень к иерархии:
class CreateConversationDto implements CreateConvo {}
class X extends CreateConversationDto {} // even without types this class can't be created
И мы вернулись к квадрату 1.
Вы можете создавать типы объединения , но не классы объединения. .
Есть ли какая-то конкретная причина, по которой вам может не понравиться этот вариант:
export class CreateYoutubeConversationDto { youtubeId: string }
export class CreateDirectConversationDto { title: string; ... }
export type CreateConvo = CreateDirectConversationDto | CreateYoutubeConversationDto
...
function some_f(arg: CreateConvo) {
if (arg instanceof CreateYoutubeConversationDto) return arg.youtubeId
else return arg.title
}