TypeScript基于现有数据类型创建表头出现类型冲突如何解决?
问题根源
你当前的报错完全是类型约束逻辑错了:你定义的业务数据类型里,字段可以是number/boolean等任意业务类型,但你要的表头对象是和业务结构完全对应、所有字段值都是字符串的文本对象,直接拿原业务类型去约束表头对象,当然会出现类型不匹配的问题。
你给UserHeaders加的| { defaultTimeout: string }联合类型属于临时凑的补丁,反而会让TS推导UserHeaders的字段类型时出现混乱,扩展到MachineHeaders的时候就会出现never类型的报错。
正确实现方案
你只需要写一个通用的TS映射工具类型,自动把任意业务数据类型转换成对应的表头类型就可以:
// 通用工具类型:传入业务数据类型,返回去掉type字段、所有字段类型为string的表头类型 type HeaderType<T> = { [K in keyof Omit<T, 'type'>]: string }
然后改写你的所有表头定义即可:
const sharedHeaders: HeaderType<sharedTypes> = { name: 'Name', OEECategory: 'OEE category', OAECategory: 'OAE category', color: 'Color', }; export const AbstractHeaders: HeaderType<AbstractData> = { ...sharedHeaders, layer: 'Layer' }; export const UserHeaders: HeaderType<UserData> = { ...sharedHeaders, defaultTimeout: 'Default timeout', stateAfterTimeout: 'State after timeout', accessCanChoose: 'Access - can choose', accessCanOverwrite: 'Access - can overwrite', }; export const MachineHeaders: HeaderType<MachineData> = { ...UserHeaders, stateCategory: 'State category', machineType: 'Machine type', canOverwriteOnlyByStates: 'Can overwrite only by states', };
这个方案的优势:
- 完全和你原有的业务数据类型结构对齐,业务类型加字段/减字段,表头类型会自动同步约束,不会出现漏加的情况
- 所有表头值自动约束为string类型,不会再出现类型冲突
- 不需要额外维护一套独立的表头类型,减少重复代码
内容的提问来源于stack exchange,提问作者Alex Ironside
相关产品推荐
相关产品推荐

