我正在使用 TypeScript 进行 Apollo Server 订阅,并在实现基于 PubSub 的订阅系统时遇到了一些问题。我遵循了Apollo 官方文档,但遇到了两个问题:
interface PubSubEvents {
CHANGE_EVENT: string;
}
export interface Context {
pubsub: PubSub<PubSubEvents>; // Error: Type 'PubSubEvents' does not satisfy the constraint '{ [event: string]: unknown; }'.
}
但是,这有效:
export interface Context {
pubsub: PubSub<{
CHANGE_EVENT: string;
}>;
}
问题:为什么显式定义的内联接口可以工作,而命名的
PubSubEvents
接口却失败?
asyncIterator
可用性问题:在我创建 pubsub
(MRE 中的 apolloServer.ts
)的文件中,我可以毫无问题地使用 pubsub.asyncIterator()
:pubsub.asyncIterator(CHANGE_EVENT);
但是在
resolvers.ts
中,我收到以下错误:
subscribe: (_, __, { pubsub }) => pubsub.asyncIterator([CHANGE_EVENT]),
// Error: Property 'asyncIterator' does not exist on type 'PubSub<PubSubEvents>'.
问题:为什么
asyncIterator
在一个文件中有效,但在另一个文件中无效?我该如何解决这种不一致?
这是一个最小的可重现示例:https://codesandbox.io/p/devbox/w8gw5t
运行
tsc
查看错误。
只需使用带有声明的 PubSub 实例的外部文件
import { PubSub } from 'graphql-subscriptions';
export const pubsub = new PubSub();