我正在为库编写一个声明文件(chart.js)。新图表构建如下:
let chart = new Chart(ctx, { type: 'line', data: ..., options: ... })
其中数据类型和选项字段取决于类型字段
在尝试对此进行建模时,我想将对象的类型建模为联合类型。这允许我指定哪些对象可以传递给构造函数(使用类型字段的字符串文字类型)
但是,数据和选项字段可以在构造后作为类中的属性访问,因为我不能使用传入对象的字段类型,而是考虑使用泛型。
我现在遇到的问题是我需要为每个字段(类型,数据和选项)使用不同的类型参数,但数据和选项的类型由类型字段的类型决定(a string literal),不仅仅是任何组合都是可能的。有没有办法只允许特定的类型参数组合而不是所有组合?例如
let lineChart = new Chart<'line', LineChartData, LineChartOptions> // OK
let barChart = new Chart<'bar', BarChartData, BarChartOptions> // OK
let chart = new Chart<'line', BarChartData, LineChartOptions> // ERROR
答案 0 :(得分:1)
如果我理解正确,那么你可以这样做:
interface ChartType<Data, Options> {
type: "line" | "bar";
data: Data[],
options: Options[];
}
interface LineType extends ChartType<string, string> {
type: "line";
}
interface BarType extends ChartType<number, number> {
type: "bar";
}
class Chart<Data, Options> {
constructor(ctx: any, type: LineType | BarType) { ... }
}
new Chart("ctx", { type: "line", data: [""], options: [] }); // ok
new Chart("ctx", { type: "bar", data: [98], options: [9] }); // ok
new Chart("ctx", { type: "line", data: [""], options: [3] }); // error
new Chart("ctx", { type: "ha?", data: [], options: [3] }); // error
只需将我的string
和number
替换为您的数据/选项类型。