You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:12:06