在TypeScript中通过自定义字段扩展通用类型的问题
TypeScript类型扩展冲突问题解决
你用Record<string, string | number> & {items: any[]}出现类型错误,核心原因是Record<string, string | number>的索引签名强制所有字符串键对应的属性值必须是string | number类型。交叉类型无法覆盖这种全局约束,因为TypeScript要求交叉后的类型同时满足两个部分的所有规则,items: any[]显然不符合string | number的要求,所以报错。
这种场景下不能直接通过交叉类型覆盖通用的索引签名约束,得换写法实现需求:
方法一:排除特定键的Record类型
用Exclude工具类型排除items键,让Record只约束除items外的其他属性,再和items属性交叉:
type ExtendedType = Record<Exclude<string, 'items'>, string | number> & { items: OrderItem[]; };
这种写法严格保证了:除items是OrderItem[]外,其他任意字符串键的属性值都是string | number。
方法二:扩展索引签名类型
如果允许所有属性(包括非items的)可以是string | number | OrderItem[],也可以直接扩展索引签名:
type ExtendedType = { items: OrderItem[]; [key: string]: string | number | OrderItem[]; };
内容的提问来源于stack exchange,提问作者Ilkiv Yuriy
相关产品推荐
相关产品推荐

