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

如何检查字符串是否为TypeScript指定接口的有效键?

解决TypeScript接口键校验与对象更新问题

核心问题说明

TypeScript接口仅存在于编译阶段,编译后会被完全移除,因此无法直接通过接口本身在运行时校验键的有效性。必须手动维护有效键集合,结合类型断言或类型守卫实现需求。

实现方案一:有效键数组+类型断言

export default interface FormListarAtendimentosDTO {
    idArea?: number;
    idAssunto?: number;
    idMotivo?: number;
    order?: string;
    page?: number;
    pageSize?: number;
}

let form: FormListarAtendimentosDTO = { order: "ASC", page: 1, pageSize: 10 };
let updateQuery = { queryParam: "idArea", value: "10" };

// 维护接口所有有效键的数组
const validDTOKeys: (keyof FormListarAtendimentosDTO)[] = [
    'idArea', 'idAssunto', 'idMotivo', 'order', 'page', 'pageSize'
];

// 校验键的有效性并更新对象
if (validDTOKeys.includes(updateQuery.queryParam as keyof FormListarAtendimentosDTO)) {
    const key = updateQuery.queryParam as keyof FormListarAtendimentosDTO;
    // 根据属性类型转换value
    switch (key) {
        case 'idArea':
        case 'idAssunto':
        case 'idMotivo':
        case 'page':
        case 'pageSize':
            form[key] = Number(updateQuery.value);
            break;
        case 'order':
            form[key] = updateQuery.value;
            break;
    }
}

实现方案二:自定义类型守卫函数

export default interface FormListarAtendimentosDTO {
    idArea?: number;
    idAssunto?: number;
    idMotivo?: number;
    order?: string;
    page?: number;
    pageSize?: number;
}

let form: FormListarAtendimentosDTO = { order: "ASC", page: 1, pageSize: 10 };
let updateQuery = { queryParam: "idArea", value: "10" };

// 类型守卫:判断字符串是否为接口的有效键
function isFormDTOKey(key: string): key is keyof FormListarAtendimentosDTO {
    return ['idArea', 'idAssunto', 'idMotivo', 'order', 'page', 'pageSize'].includes(key as any);
}

if (isFormDTOKey(updateQuery.queryParam)) {
    // 根据键对应的类型处理value
    switch (updateQuery.queryParam) {
        case 'idArea':
        case 'idAssunto':
        case 'idMotivo':
        case 'page':
        case 'pageSize':
            form[updateQuery.queryParam] = Number(updateQuery.value);
            break;
        case 'order':
            form[updateQuery.queryParam] = updateQuery.value;
            break;
    }
}

关键要点解释

  • hasOwnProperty/in操作符无效原因:这两个操作符只能检查当前form实例上是否存在该属性,但接口的可选属性可能未被初始化,无法覆盖所有有效键的校验场景。
  • keyof的作用:keyof FormListarAtendimentosDTO会生成接口所有键的联合类型('idArea' | 'idAssunto' | ... | 'pageSize'),用于编译阶段约束键的类型,避免无效赋值。
  • 类型转换必要性:updateQuery.value是字符串类型,但接口中部分属性为数字类型,需根据键的类型手动转换值,确保类型匹配。

内容的提问来源于stack exchange,提问作者Asderek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:05:12