为何Geolib的getCenter()返回false|坐标对象类型?如何解决?
问题分析与解决:geolib getCenter() TypeScript类型错误
为什么返回多类型?
geolib的getCenter()函数设计上会在输入参数不合法时返回false,比如传入的坐标数组为空、坐标对象缺少latitude/longitude字段、经纬度值不是有效数字等。TypeScript的类型定义精准匹配了这个行为,所以函数的返回类型被定义为false | { longitude: number; latitude: number; }。
解决办法
1. 提前校验输入合法性
先确保传入的坐标都是有效格式,再调用函数:
// 定义类型守卫,校验坐标有效性 const isValidCoordinate = (coord: unknown): coord is { latitude: number; longitude: number } => { return typeof coord === 'object' && coord !== null && 'latitude' in coord && typeof (coord as any).latitude === 'number' && 'longitude' in coord && typeof (coord as any).longitude === 'number'; }; const targetCoords = [markerLocation, props.actualCoordinates]; if (targetCoords.every(isValidCoordinate)) { const centerMap = getCenter(targetCoords); // 此时TypeScript会自动推断centerMap为坐标对象,可安全访问属性 console.log(centerMap.longitude); } else { console.error('传入的坐标格式无效,请检查'); }
2. 类型守卫判断返回值
在访问属性前先判断返回结果不是false:
const centerMap = getCenter([markerLocation, props.actualCoordinates]); if (centerMap !== false) { // TypeScript会自动缩小类型范围,允许访问longitude/latitude console.log(centerMap.longitude); } else { console.error('计算中心点失败,请检查输入坐标'); }
3. 非空断言(谨慎使用)
如果你能100%确认输入参数合法,不会触发返回false的情况,可以用非空断言跳过TypeScript的类型检查:
const centerMap = getCenter([markerLocation, props.actualCoordinates])!; console.log(centerMap.longitude);
注意:如果实际输入不合法,运行时会抛出错误,仅在参数可靠性极高的场景使用。
内容的提问来源于stack exchange,提问作者Ruairidh Grass
相关产品推荐
相关产品推荐

