You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:14:58