我试图找出一些更新某些svg元素位置的TypeScript d3代码的正确类型。代码既可以在没有转换的情况下运行(即它应该立即更新),也可以通过转换运行。我已经编写了一个辅助方法来执行更新,但是我无法确定正确的类型。我的代码是这样的:
const circles = group.selectAll('circle').data(points);
if (transitionsEnabled) {
updateCircles(circles.transition().duration(1000));
} else {
updateCircles(circles);
}
function updateCircles(circles: d3.Selection<d3.BaseType, Point, d3.BaseType, {}> {
circles
.attr('cx', (d: Point) => d.x)
.attr('cy', (d: Point) => d.y)
.attr('r', 5);
}
这给我一个错误:Argument of type 'Transition<BaseType, Point, BaseType, {}>' is not assignable to parameter of type 'Selection<BaseType, Point, BaseType, {}>
在启用了转换的调用上。
将函数参数的类型切换为Transition会产生等效错误。我可以通过给函数参数一个
类型来解决它d3.Selection<d3.BaseType, Point, d3.BaseType, {}>|d3.Transition<d3.BaseType, Point, d3.BaseType, {}>
但这看起来很难看。有没有更好的方法来键入此方法?我可以创建一个类型别名,使事情变得更平滑,但这似乎应该已经存在。