typescript Openlayers,从FeatureLike推断要素类型

mrzz3bfm  于 2023-06-30  发布在  TypeScript
关注(0)|答案(1)|浏览(237)

修改特征将触发以下事件。

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

eiee3dmh

eiee3dmh1#

我在处理Map上的单击事件时遇到了同样的问题。回调参数中的目标是FeatureLike[],但我需要Feature来响应单击事件。
我也找不到一个合适的方法将类型FeatureLike转换为Feature。然后检查FeatureLike提供的属性和方法。它们如下

使用这些方法,我创建了新的Feature来满足我的需要。getGeometry()返回Geometry | RenderFeature | undefined,这意味着创建新功能时需要额外的操作。但这并不复杂,只是强制将类型Assert为Geometry。它适用于我的情况,因为Map上的对象类型不多。更复杂的用例可能需要更多的逻辑来保护特征创建步骤。代码如下。

...
        if (targetFeature.getGeometry()) {
            setActiveFeature(
              new Feature({
                geometry: targetFeature.getGeometry() as Geometry,
                ...targetFeature.getProperties(),
              }),
              false
            );
          }
...

这不是最好的做法,但它可以解决我的问题。你可以参考这篇文章,希望它能给予你一些灵感,让你找到更好的工作。

相关问题