父类返回子类的实例会导致TypeScript错误

时间:2019-02-01 21:07:29

标签: javascript typescript oop webpack

我有一个 CalendarEvents 和一个名为 SelectedEvents 的继承子类。当访问CalendarEvents.selected属性时,将返回SelectedEvents实例。

我收到此错误:

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

这导致了get selected(): SelectedEvents行。

我在Google搜索后遇到的错误很快就导致了循环依赖问题。我创建了一个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 :(得分:0)

我再次遇到了这个问题,这是我解决的方法:

检查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';

EventsCalendarEventsSelectedEvents的抽象超类。