TypeScript如何通过泛型动态设置对象键合并相似类型
正确实现代码
你可以通过交叉类型 + 映射类型/Record工具类型实现需求,代码如下:
// 通用版本,支持传入任意字符串作为键名 type Timestamps<T extends string> = { timestamps: { start: number; end: number }; } & Record<T, string>;
如果需要严格限制只能传入word或sentence两个可选值,可以收紧泛型约束:
// 严格版本,仅允许使用预设的两个键名 type Timestamps<T extends 'word' | 'sentence'> = { timestamps: { start: number; end: number }; } & Record<T, string>;
使用效果完全符合要求:
Timestamps<'word'>等价于原WordTimestamps类型Timestamps<'sentence'>等价于原SentenceTimestamps类型
原代码错误原因
你原本的写法里[key: T]: string是索引签名语法,索引签名仅支持string/number/symbol这类全局类型,不支持直接传入泛型参数作为键的类型,所以无法生效。而Record<T, string>本质是{ [K in T]: string }的语法糖,属于映射类型,可以动态根据泛型参数生成对应的键值对类型,再和固定的timestamps属性做交叉,就能得到需要的组合类型。
内容的提问来源于stack exchange,提问作者chocojunkie
相关产品推荐
相关产品推荐

