如何利用TypeScript类型通过键取值并解决类型匹配错误?
问题解决与用法说明
一、当前类型错误的原因及修复
你定义的MHStatus是TypeScript类型别名,仅存在于编译阶段,运行时不存在对应的实体对象。直接通过MHStatus['AVAILABLE']访问会报错,因为类型不能作为值来使用。
正确的定义方式
需要同时定义运行时可用的常量对象和从对象派生的类型,确保类型与值同步:
// 定义运行时可访问的常量对象,as const 确保值的类型是字面量而非string export const MHStatus = { AVAILABLE: "AVAILABLE", IN_PROGRESS: "IN_PROGRESS", UNAVAILABLE: "UNAVAILABLE" } as const; // 从常量对象派生类型,自动获取所有值的联合类型 export type MHStatus = typeof MHStatus[keyof typeof MHStatus];
修复后的业务代码
现在可以正常通过常量对象访问状态值,且类型会被正确推导:
const status = isTrue ? MHStatus.AVAILABLE : MHStatus.UNAVAILABLE; const formatOnj = await formatobjTOAdd(getterSetter, id, status);
此时status的类型是"AVAILABLE" | "UNAVAILABLE",完全符合formatobjTOAdd函数的参数类型要求。
二、通过传递键获取对应值的类型安全方式
如果需要通过键名动态获取状态值,可以用泛型约束键的范围,同时让TypeScript自动推导返回值的类型:
// 泛型函数:约束键必须是MHStatus对象的键,返回对应值的字面量类型 function getStatusValue<K extends keyof typeof MHStatus>(key: K): typeof MHStatus[K] { return MHStatus[key]; } // 使用示例 const available = getStatusValue('AVAILABLE'); // 类型为"AVAILABLE" const unavailable = getStatusValue('UNAVAILABLE'); // 类型为"UNAVAILABLE"
这种方式既保证了运行时可以正确获取值,又在编译阶段提供了严格的类型检查,避免传入无效键名。
内容的提问来源于stack exchange,提问作者ganesh kaspate
相关产品推荐
相关产品推荐

