TypeScript如何仅根据type类型动态生成对应结构的空对象
结论:无法仅依靠type类型定义动态生成对应的空对象
原因说明
TypeScript 的类型系统是纯静态的编译期特性,所有类型、类型运算符(比如你用到的keyof T)只会在编译阶段参与类型校验,编译为 JavaScript 之后所有类型信息会被完全抹除,运行时根本不存在T这个类型的任何信息,自然也没办法遍历它的属性键。你预想的写法里把keyof T放到运行时的for循环中遍历是完全不可行的。
可行的替代实现
TypeScript 生态中通用的解决方案是先定义运行时可用的属性集合,再反向推导类型,保证类型和运行时结构只需要定义一次、完全对齐,实现如下:
// 1. 先定义运行时能访问到的属性列表,用as const锁定字面量类型 const fooKeys = ['go', 'start'] as const // 2. 从属性列表反向推导出你需要的类型,不需要重复写属性 type Foo = Record<typeof fooKeys[number], string> // 3. 编写通用生成函数 function generate<T extends string>(keys: readonly T[]): Record<T, string> { return Object.fromEntries(keys.map(key => [key, ''])) as Record<T, string> } // 4. 使用:得到的对象既符合Foo类型,值也是你要的空字符串结构 const emptyFoo = generate(fooKeys) // emptyFoo 的值为 { go: '', start: '' },类型自动推导为Foo
内容的提问来源于stack exchange,提问作者mandaputtra
相关产品推荐
相关产品推荐

