我有代码,将图表的数据在时间线上.我想让它接收一系列的序列.每个系列包含数据数组和几个将应用于每个数据项以在图表上定位和呈现数据项的获取方法.
以下是一些经过高度简化的示例代码.在DataSeries<T>
上会有多个Getter,渲染将使用Reaction完成,但这与我面临的问题无关.
export interface DataSeries<T> {
data: T[];
asNumber: (d: T) => number;
}
export function DataSeriesAsNumbers<T>(series: DataSeries<T>[]) {
series.forEach((s) => {
s.data.forEach((d) => {
console.log(s.asNumber(d).toFixed(0));
});
});
}
在使用该函数时,我希望根据附带的data
属性中给出的数组正确地推断出getNumber
个回调的参数.
DataSeriesAsNumbers([
{
data: [
{ val: 1, seq: 12346 },
{ val: 2, seq: 12347 },
],
asNumber: (d) => d.val,
},
{
data: [
{ amount: 6, type: 5 },
{ amount: 20, type: 4 },
],
asNumber: (d) => d.amount,
},
]);
到目前为止,我一直无法做到这一点.我通过手动分配类型(使用as
、satisfies
或通过单独创建类型化的系列对象)或只使用DataSeriesAsNumbers<T = any>
将类型抛出窗口来使其工作.
问题似乎源于series: DataSeries<T>[]
,所以一旦您在不同的data
属性中混合了不同的对象,所有的获取器现在都必须坚持整个Union类型.上面的代码导致编译器将联合类型分配给d
参数:
我曾研究过使用infer
这个关键字,但也没有弄明白这一点.我在网上看过语法[...T]
,但同样没有做到.
是否可以根据数据数组自动推断回调参数的类型?