TypeScript报错:Type 'key'无法索引type 'data'类型求解决
解决TypeScript索引错误:Type 'key' cannot be used to index type 'data'
问题原因
你的代码中泛型约束T extends Record<NotificationDataType, true>不符合实际需求:这会让keyof T的类型推断与data的键类型关联失效,导致TypeScript无法确认key是data的有效索引;同时type字段的类型被错误约束为包含所有枚举键的对象,而非预期的枚举成员。
修复方案
调整泛型约束,让T直接对应data的键类型(即NotificationDataType枚举成员),并通过Pick工具类型或映射类型正确关联data的字段类型:
// 重命名类型为首字母大写,符合TS规范(非强制,仅提升可读性) type DataMap = { [NotificationDataType.USER]: User; [NotificationDataType.COMMUNITY]: Community; [NotificationDataType.LISTING]: Listing; [NotificationDataType.COMMENT]: Comment; }; export interface SendNotificationOptions<T extends keyof DataMap> { type: T; message: string; // 方式1:使用Pick工具类型直接提取对应键的类型 data: Pick<DataMap, T>; // 方式2:使用映射类型,效果与Pick一致 // data: { [K in T]: DataMap[K] }; iconId?: string; iconName?: string; recepients: string[]; sendEmail?: boolean; }
说明
- 泛型
T被约束为keyof DataMap,确保T只能是NotificationDataType的有效枚举成员,此时T的所有键必然是DataMap的有效索引,从根源消除类型错误。 Pick<DataMap, T>会自动提取DataMap中所有属于T的键值对类型,无需手动映射,代码更简洁。
内容的提问来源于stack exchange,提问作者Sostene MUNEZERO BAGIRA
相关产品推荐
相关产品推荐

