NestJS中PubSub报错:类型不存在asyncIterator属性(TypeScript 2339)
解决NestJS中PubSub的TypeScript错误:Property 'asyncIterator' does not exist on type 'PubSub<Record<string, never>>'
这个错误源于graphql-subscriptions v3.x 移除了PubSub类的asyncIterator方法,同时默认类型定义过于宽泛导致类型推断失效。以下是具体修复步骤:
1. 替换asyncIterator为subscribe方法
v3版本的PubSub改用subscribe方法创建异步迭代器,直接替换代码中的调用:
@Subscription(() => ChatModel, { name: 'chatSent', filter: function (this: ChatResolver, payload, variables, context) { // 注意:需从context中正确获取user,比如const user = context.user; return this.chatService.filterChatSentEvent(payload, context.user); }, }) chatSent() { return pubSub.subscribe('chatSent'); // 替换asyncIterator为subscribe }
2. 为PubSub指定正确的泛型类型
默认的PubSub<Record<string, never>>会导致TypeScript无法推断事件payload类型,创建实例时明确指定事件类型映射:
import { PubSub } from 'graphql-subscriptions'; // 定义所有订阅事件的类型映射 type PubSubEvents = { chatSent: ChatModel; // 对应chatSent事件的payload类型 }; export const pubSub = new PubSub<PubSubEvents>();
3. 额外修复:filter函数的变量问题
你代码中的user变量未定义,需从context参数中提取(比如context.user),否则会触发另一个TypeScript错误。
内容的提问来源于stack exchange,提问作者justdvl
相关产品推荐
相关产品推荐

