提问人:Martin Hansson 提问时间:6/3/2023 最后编辑:Martin Hansson 更新时间:6/4/2023 访问量:62
通用 Typeguard
Generic Typeguard
问:
因此,在工作中,我们使用这些类型来创建几何图形的基础:
export type GeoJSON = Geometry | Feature;
export type GeoJsonTypes = GeoJSON['type'];
export interface GeoJsonObject { type: GeoJsonTypes; }
export interface Point extends GeoJsonObject {
type: 'Point';
coordinates: number[];
}
export interface MultiPoint extends GeoJsonObject {
type: "MultiPoint",
coordinates: number[][];
}
export type Geometry =
| Point
| MultiPoint
export interface Feature<G extends Geometry = Geometry>
extends GeoJsonObject {
type: 'Feature';
geometry: G;
}
问题在于,我们最终必须为每个 Geometry 创建单独的 typeguard:
export const isPointGeometry = (g: Geometry): g is Point => {
return (g as Point).type === 'Point';
};
我试图通过编写以下内容来创建一个通用的typeguard:
export function isGeometry<T extends Geometry, G extends GeoJsonObject['type']>(feature: T, geometry: G): feature is T {
return feature && feature && feature.type === geometry;
}
但无济于事。因为我仍然有问题?有人有想法吗?
export function coordinatesFor(f: Feature<Point | MultiPoint>) {
if (isGeometry(f.geometry, 'Point')) {
return f.geometry.coordinates ?? []; // Expected Feature<Point> but got Feature<Point | MultiPoint>
}
return [];
}
答:
2赞
darbaidze2020
6/3/2023
#1
试试这个方法:
function isGeometry<T extends Geometry, G extends T['type'] = Geometry['type']>(
feature: T,
geometry: G,
): feature is Extract<T, { type: G }> {
return feature && feature && feature.type === geometry;
}
在这里,我们做两件事:
我们根据参数推断类型,以确保始终与给定兼容,并且不可能使用错误的参数组合调用函数,例如:。
G
T
G
T
isGeometry(somePoint, 'Polygon')
对于返回类型,我们选择那些与(我们正在寻找的几何图形)兼容的联合成员。
Extract<T, { type: G }>
Geometry
{ type: G }
评论
2赞
jcalz
6/3/2023
虽然此代码可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文可以提高其长期价值。
0赞
Martin Hansson
6/4/2023
谢谢你,它工作得很好!你介意解释一下它是如何工作的吗,我不明白我为什么需要?我想我理解为什么我们需要它基本上是因为我们想根据类型缩小几何形状,例如“点”,这是一个唯一的标识符,因此总是给我们留下一个选项,这就是让我们实际上缩小范围并为我们提供所需的类型保护的原因。= Geometry['type']
Extract<T, {type: G}>
0赞
darbaidze2020
6/4/2023
@MartinHansson,如果我们(出于某种原因)想显式传递第一个参数,我使用等号使第二个参数(泛型)对于这种情况是可选的。在我们的例子中,无论我们是否使用或为此,两者都以相同的方式工作。P.S:我在答案中添加了解释。= Geometry['type']
= Geometry['type']
= T['type']
评论
feature && feature