如何使用Keyof类型操作符获取TypeScript类型键的运行时字符串数组
核心结论
仅使用keyof操作符无法得到运行时的键字符串数组,仅通过Interface定义也无法实现该需求,类不存在同类限制。
底层原因
TypeScript的类型系统是擦除式设计,所有interface、type定义、keyof这类类型操作符,仅在编译阶段生效,编译为JavaScript后会被完全清除,不会保留在运行时环境中。keyof Identity得到的只是编译阶段的字面量联合类型,无法转换为运行时可用的数组值。
推荐替代方案
方案1:反向推导类型(无额外依赖、类型安全)
这是当前最简便的原生实现方案,只需要维护一份运行时键数组,自动同步生成Interface类型,避免类型和运行时值不一致的问题:
// 先定义运行时可用的键数组,用as const锁字面量类型 const IDENTITY_KEYS = ["username", "name", "surname", "roles"] as const; // 从键数组反向推导Identity接口类型 export interface Identity extends Record<Exclude<typeof IDENTITY_KEYS[number], 'roles'>, string> { roles: string[]; } // 直接拿到符合要求的运行时键数组 const keys: string[] = IDENTITY_KEYS;
方案2:使用类实现
就是你目前已知的方案,类的实例成员会保留在运行时中,直接通过实例拿属性键即可:
class Identity { constructor( readonly username?: string, readonly name?: string, readonly surname?: string, readonly roles?: string[] ) {} } const properties: string[] = Object.keys(new Identity());
方案3:自定义TS转换器
如果不想手动维护键数组,可以使用自定义编译转换器在编译阶段自动注入类型键到运行时代码中,但需要修改TypeScript编译配置,接入成本相对更高。
内容的提问来源于stack exchange,提问作者1Z10
相关产品推荐
相关产品推荐

