TypeScript接口能否内置验证?地图坐标范围需求示例
TypeScript接口能否内置验证功能?
TypeScript的接口仅用于编译时静态类型检查,本身不具备运行时的验证能力,没法直接在接口里内置范围校验逻辑。不过可以通过以下几种方式实现你的坐标范围限制需求:
1. 自定义类型守卫函数
通过类型守卫在运行时校验值的合法性,同时让TypeScript在编译时识别合法类型:
export interface MapCoordinates { latitude: number; longitude: number; } // 类型守卫函数:校验并标记合法类型 function isValidMapCoordinates(coords: unknown): coords is MapCoordinates { if (typeof coords !== 'object' || coords === null) return false; const { latitude, longitude } = coords as MapCoordinates; return ( typeof latitude === 'number' && latitude >= -90 && latitude <= 90 && typeof longitude === 'number' && longitude >= -180 && longitude <= 180 ); } // 使用示例 const testCoords = { latitude: 100, longitude: 200 }; if (isValidMapCoordinates(testCoords)) { // 此处testCoords会被TypeScript识别为MapCoordinates类型 console.log(testCoords.latitude); } else { console.error('坐标不符合范围要求'); }
2. 用类替代接口
如果需要封装性更强的实例化验证,可以用类实现,在构造函数中做范围校验:
export class MapCoordinates { private _latitude: number; private _longitude: number; constructor(latitude: number, longitude: number) { if (latitude < -90 || latitude > 90) { throw new Error('纬度必须在-90到90之间'); } if (longitude < -180 || longitude > 180) { throw new Error('经度必须在-180到180之间'); } this._latitude = latitude; this._longitude = longitude; } get latitude() { return this._latitude; } get longitude() { return this._longitude; } } // 使用示例 try { const validCoords = new MapCoordinates(30, 120); console.log(validCoords.latitude); } catch (e) { console.error((e as Error).message); }
3. 使用断言函数
断言函数可在运行时验证数据,同时告知TypeScript该数据符合目标类型:
export interface MapCoordinates { latitude: number; longitude: number; } // 断言函数:校验不通过则抛出错误,通过则标记类型 function assertValidMapCoordinates(coords: unknown): asserts coords is MapCoordinates { if (typeof coords !== 'object' || coords === null) { throw new Error('坐标必须是对象'); } const { latitude, longitude } = coords as MapCoordinates; if (typeof latitude !== 'number' || latitude < -90 || latitude > 90) { throw new Error('纬度必须是-90到90之间的数字'); } if (typeof longitude !== 'number' || longitude < -180 || longitude > 180) { throw new Error('经度必须是-180到180之间的数字'); } } // 使用示例 const inputCoords = { latitude: 45, longitude: -90 }; assertValidMapCoordinates(inputCoords); // 此处inputCoords会被TypeScript识别为MapCoordinates类型 console.log(inputCoords.longitude);
总结:接口本身无法实现运行时验证,需结合类型守卫、类或断言函数,才能同时满足编译时类型检查和运行时范围验证的需求。
内容的提问来源于stack exchange,提问作者Lelstz
相关产品推荐
相关产品推荐

