如何检查字符串是否为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
相关产品推荐
相关产品推荐

