修改特征将触发以下事件。
import { ModifyEvent } from "ol/interaction/Modify";
type DrawToolEvent {
type: string
me: ModifyEvent
layer: VectorLayer<any>
}
并且下面的逻辑在订阅DrawToolEvent的端执行。
this.drawTool.drawEvent.subscribe((e: DrawToolEvent) => {
if(e.type === 'A') {
// ...
} else if(e.type === 'B') {
// ...
} else if (e.type === 'C') {
const featureLike = e.me.features.getArray()[0]
const clone = featureLike.clone() // error: Property 'clone' does not exist on type 'FeatureLike'. Property 'clone' does not exist on type 'RenderFeature'.
// ...
}
})
问题
TypeScript说e.me.features.getArray()[0]
返回FeatureLike
类型,但当我通过控制台检查时,它实际上返回Feature
类型。它实际上是以下面的方式工作的。
// works.
// @ts-ignore
const clone = e.me.features.getArray()[0].clone()
// works.
const clone = (e.me.features.getArray()[0] as Feature<Point>).clone()
// not works.
const clone = e.me.features.getArray()[0].clone()
提问
我不想每次都改变或忽略类型。有没有更好的方法将类型FeatureLike
转换为Feature<T>
?
ol v6.9.0
1条答案
按热度按时间eiee3dmh1#
我在处理Map上的单击事件时遇到了同样的问题。回调参数中的目标是
FeatureLike[]
,但我需要Feature
来响应单击事件。我也找不到一个合适的方法将类型
FeatureLike
转换为Feature
。然后检查FeatureLike
提供的属性和方法。它们如下使用这些方法,我创建了新的
Feature
来满足我的需要。getGeometry()
返回Geometry | RenderFeature | undefined
,这意味着创建新功能时需要额外的操作。但这并不复杂,只是强制将类型Assert为Geometry
。它适用于我的情况,因为Map上的对象类型不多。更复杂的用例可能需要更多的逻辑来保护特征创建步骤。代码如下。这不是最好的做法,但它可以解决我的问题。你可以参考这篇文章,希望它能给予你一些灵感,让你找到更好的工作。