Apollo 服务器订阅和 PubSub 中 asyncIterator 的 Typescript 问题

问题描述 投票:0回答:1

我正在使用 TypeScript 进行 Apollo Server 订阅,并在实现基于 PubSub 的订阅系统时遇到了一些问题。我遵循了Apollo 官方文档,但遇到了两个问题:

  1. 通用接口问题:将 PubSub 类与自定义 PubSubEvents 接口一起使用会导致错误:
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
接口却失败?

  1. 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
查看错误。

typescript graphql publish-subscribe apollo-server
1个回答
0
投票

只需使用带有声明的 PubSub 实例的外部文件

import { PubSub } from 'graphql-subscriptions';

export const pubsub = new PubSub();
© www.soinside.com 2019 - 2024. All rights reserved.