如何缩小as const声明对象的Object.keys返回值类型范围
缩小Object.keys返回值的类型到对象键的字面量类型
针对你定义的LOGIC_CATEGORIES常量,有两种安全的方式缩小Object.keys返回值的类型,同时保留类型安全性:
方法一:直接使用类型断言
将Object.keys的结果断言为对象键的数组类型,适用于单次使用的场景:
const LOGIC_CATEGORIES = { core: "Core", transformer: "Transformers", logic: "Logical Operators", requests: "Requests", } as const; (Object.keys(LOGIC_CATEGORIES) as Array<keyof typeof LOGIC_CATEGORIES>).map((category) => { // 此时category的类型为 "core" | "transformer" | "logic" | "requests" console.log(LOGIC_CATEGORIES[category]); });
方法二:封装类型安全的工具函数
如果需要多次使用,封装一个通用函数可以避免重复写断言,同时保证类型一致性:
const LOGIC_CATEGORIES = { core: "Core", transformer: "Transformers", logic: "Logical Operators", requests: "Requests", } as const; // 通用工具函数,返回对象键的字面量类型数组 const getTypedKeys = <T extends object>(obj: T): Array<keyof T> => { return Object.keys(obj) as Array<keyof T>; }; // 使用工具函数 getTypedKeys(LOGIC_CATEGORIES).map((category) => { console.log(LOGIC_CATEGORIES[category]); });
补充说明
TypeScript默认将Object.keys的返回值设为string[],是因为无法在编译期确保运行时对象没有额外的可枚举属性。但对于你用as const定义的纯字面量对象,上述两种方法都是安全的,不会丢失类型安全性。
内容的提问来源于stack exchange,提问作者Sebastiaan
相关产品推荐
相关产品推荐

