使用泛型时对类型参数组合的约束

时间:2016-07-12 21:18:59

标签: typescript

我正在为库编写一个声明文件(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

1 个答案:

答案 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

code in playground

只需将我的stringnumber替换为您的数据/选项类型。