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

TypeScript报错咨询:FindCursor类型不匹配与Promise参数错误

两个TypeScript报错的原因及修复方案

报错1:类型错误:'FindCursor'缺少Type 'Topping'的name、priceCents属性

原因

collection.find({ _id: ID }) 返回的是 FindCursor 类型(游标对象),不是单个Topping文档。你直接把游标赋值给Topping类型变量,类型不匹配,自然缺少name、priceCents这些属性。而且你要根据ID查询单个配料,应该用findOne而不是find。

修复代码

public async getToppingsData(ID: string): Promise<Topping> {
    // 用findOne替代find,返回单个文档或null
    const data = await this.collection.findOne({ _id: ID });
    if (!data) {
      throw new Error(`Could not find ${ID}`);
    }

    // 此时data是符合Topping文档结构的数据,通过转换函数转成Topping类型
    return toToppingObject(data);
  }

注:需确保存在toToppingObject函数,逻辑类似你提供的toPizzaObject,负责把MongoDB文档转成Topping实体。

报错2:参数错误:类型'Promise'无法赋值给参数类型'void'

原因

  1. getToppingsByIds函数声明返回Promise<String[]>,但实际没有任何返回值,函数体末尾缺少return语句;
  2. toppingIds.map的回调逻辑混乱:每次循环重新声明toppingArray导致结果丢失;getToppingsData是异步函数,直接push得到的是Promise数组而非Topping实例;toppingNames.map里往自身push值,完全不符合map的用法。

修复代码

public async getToppingsByIds(toppingIds: string[]): Promise<string[]> {
    // 用Promise.all并行处理所有异步请求,等待所有查询完成
    const toppings = await Promise.all(
      toppingIds.map(id => this.getToppingsData(id))
    );
    // 提取每个配料的name返回
    return toppings.map(topping => topping.name);
  }

关键修正点

  • 用Promise.all处理多个异步查询,确保拿到所有Topping实例;
  • 直接通过map提取目标字段,避免冗余的数组操作;
  • 函数返回处理后的数组,符合Promise<string[]>的类型声明;
  • 建议用小写string替代大写String(前者是TypeScript推荐的原始类型,后者是包装对象)。

内容的提问来源于stack exchange,提问作者Acer79

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:10:26