Apollo Server中TypeScript泛型PubSub命名接口报错问题及解决方法
问题原因
Apollo Server的PubSub类对泛型参数有明确约束:必须符合{ [event: string]: unknown }(即带有字符串索引签名的类型)。
你定义的PubSubEvents是一个命名接口,仅声明了CHANGE_EVENT这个具体属性,但没有显式添加字符串索引签名。TypeScript不会自动为接口推断该签名,因此无法通过约束检查。而内联对象类型会被TypeScript默认视为兼容索引签名的类型,所以可以正常通过校验。
解决方法
以下几种方式都能保留命名类型的同时解决报错:
1. 将接口改为类型别名
类型别名在这种场景下会被TypeScript自动兼容索引签名约束:
type PubSubEvents = { CHANGE_EVENT: string; }; export interface Context { pubsub: PubSub<PubSubEvents>; // 正常编译 }
2. 给接口添加显式索引签名
直接为接口补充字符串索引签名,明确符合PubSub的泛型约束:
interface PubSubEvents { CHANGE_EVENT: string; // 添加字符串索引签名,匹配约束要求 [key: string]: unknown; } export interface Context { pubsub: PubSub<PubSubEvents>; // 正常编译 }
3. 用Record辅助类型包装接口
通过Record将接口转换为符合约束的类型:
interface PubSubEvents { CHANGE_EVENT: string; } export interface Context { pubsub: PubSub<Record<keyof PubSubEvents, PubSubEvents[keyof PubSubEvents]>>; // 正常编译 }
内容的提问来源于stack exchange,提问作者Unlucky
相关产品推荐
相关产品推荐

