Родительский класс, возвращающий экземпляр дочернего класса, приводит к ошибке в TypeScript - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть CalendarEvents и дочерний унаследованный класс с именем SelectedEvents .Экземпляр SelectedEvents возвращается при обращении к свойству CalendarEvents.selected.

Я получаю эту ошибку:

CalendarEvents.ts:126 Uncaught TypeError: Class extends value undefined is not a constructor or null

Это приводит к строке get selected(): SelectedEvents.

Ошибка, которую я получил, когда Googled быстро привел меня к проблеме циклической зависимости.Я создал файл index.ts, экспортирующий все классы и интерфейсы, надеясь, что это решит проблему:

// ./index.ts

export * from '../config';
export * from './classes/Blocker';
export * from './classes/CalendarEvent';
export * from './classes/CalendarEvents';
// no SelectedEvents because I tried putting it in the same file
export * from './classes/Selection';
export * from './classes/Slidedown';
export * from './interfaces/IcalendarEventHTMLElement';
export * from './interfaces/Idetail';
export * from './interfaces/IuncompletedRequest';
export * from './repeatWebRequest';
export * from '../config';

Это не .Затем я решил поместить CalendarEvents и SelectedEvents в один и тот же файл, но безрезультатно.

Вот код (пожалуйста, спросите, удалил ли я что-то важное):

// ./classes/CalendarEvents.ts

import { CalendarEvent } from '..';

interface IcalendarEvents {
    [index: string]: CalendarEvent;
}

export class CalendarEvents {
    // no constructor class
    public events: IcalendarEvents;

    get calendarEvents(): CalendarEvent[] {
        return Object.values(this.events);
    }

    // supposedly errors here:
    get selected(): SelectedEvents {
        return new SelectedEvents(
            this.calendarEvents.filter((event: CalendarEvent) => {
                return event.selected;
            })
        );
    }
}

export class SelectedEvents extends CalendarEvents {
    constructor(selectedEvents?: Set<CalendarEvent> | CalendarEvent[]) {
        super();
        for (const event of selectedEvents) {
            this.events[event.eid] = event;
        }
    }
}

Может быть, этоплохой дизайн в целом.Если так, как еще можно было бы сделать что-то подобное?Кстати, все это скомпилировано с Webpack.

1 Ответ

0 голосов
/ 03 февраля 2019

Я снова столкнулся с этой проблемой, вот как я ее исправил:

Проверьте ваш index.ts для порядка ваших импортов / экспортов.

До:

export * from './classes/CalendarEvents';
export * from './classes/Events';
export * from './classes/SelectedEvents';

После:

export * from './classes/Events';
export * from './classes/CalendarEvents';
export * from './classes/SelectedEvents';

Где Events является абстрактным суперклассом CalendarEvents и SelectedEvents.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...