【发布时间】:2021-12-12 17:05:28
【问题描述】:
我有一个Chart 类,它有几个扩展Chart 的子类(BarChart、TimeseriesChart...)。
我使用一种称为buildChart 的方法来构建这些图表。它使用 Map 将枚举 ChartsEnum(例如 stackedTimeseries 或 barChart)映射到正确的类:
export function buildChart(type: Charts, data: Array<TimeseriesData>) {
var chartsMap = new Map<Charts, InstantiableAbstractClass<typeof Chart>([
[Charts.stackedTimeseries, TimeseriesChart],
[Charts.barChart, BarChart],
])
const chart = chartsMap.get(type)
return new chart(data).chart;
}
InstantiableAbstractClass 类型如下所示:
export declare type InstantiableClass<T> = (new ( ...args: any) => { [x: string]: any }) & T;
例如TimeseriesChart的类和构造函数如下所示:
export class TimeseriesChart extends Chart{
constructor(data: Array<TimeseriesData>) {
super(data);
}
}
我现在想向chart 类添加第二个属性,称为options(在现有属性data 旁边)。
现在的问题是options 需要每个 ChartType(BarChart、TimeseriesChart)不同的属性。
例如BarChart 需要这些属性:
{
start: number;
end?: number;
}
而TimeseriesChart 需要这样的类型:
{
description: string;
}
TimeseriesChart 的构造函数将如下所示:
export class TimeseriesChart extends Chart{
constructor(data: Array<TimeseriesData>, options: TimeseriesChartOptions) {
super(data, options);
}
}
这意味着方法buildChart 需要一个新参数options,然后可以将其传递给特定的类(与参数data 一样)。
这样做的最佳方法是什么?我想过使用泛型,然后为 n 个子类定义 options 的 n 种类型,但我不知道如何为此正确更改类型 InstantiableAbstractClass。
您可以找到带有一些描述的完整示例here。
非常感谢您的帮助!如果您需要任何进一步的信息,我很乐意提供。
谢谢你,一切顺利 卢卡斯
【问题讨论】:
-
请提供minimal reproducible example,清楚地表明您面临的问题。理想情况下,有人可以将代码放入像The TypeScript Playground (link here!) 这样的独立IDE 中,然后立即着手解决问题,而无需首先重新创建它。所以应该没有错别字、不相关的错误或未声明/未导入的类型或值。
-
嗨@jcalz,我编辑了代码,希望现在一切正常。你可以找到它here
-
有空我会去看看,但你应该用你更新的代码和任何链接直接edit这个问题。
-
在 cmets 中你说“我希望只有
options只接受TimeseriesChartOptions类型的对象”但我不知道TimeseriesChartOptions是什么,你没有定义它.理想情况下,minimal reproducible example 应该有具体示例,其中某些内容与您想要的不同,其中不希望的结果以某种方式突出显示(例如,不应该出现错误,反之亦然)。 -
嗨@jcalz。抱歉,感谢您的耐心等待:D Here 是更新后的游乐场。我希望它现在可以提供所有必需的信息。
标签: javascript typescript class generics types