Класс может реализовывать только тип объекта или пересечение типов объектов со статически известными членами. - PullRequest
4 голосов
/ 07 мая 2020

У меня есть:

class CreateYoutubeConversationDto {
    @ApiProperty({ required: true })
    youtubeId: string;

}
class CreateDirectConversationDto {
    @ApiProperty({ required: false })
    title: string;

    @ApiProperty({ required: false })
    description: string;

    @ApiProperty({ required: true })
    createdByUserId: string;
}

type CreateConvo = typeof CreateDirectConversationDto | typeof CreateYoutubeConversationDto

export class CreateConversationDto implements CreateConvo { }

Но это дает мне сообщение об ошибке CreateConvo:

A class can only implement an object type or intersection of object types with statically known members

Что это значит? У меня объявлены все типы.

1 Ответ

2 голосов
/ 11 июня 2020

Давайте на мгновение заменим 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...