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'
原因
getToppingsByIds函数声明返回Promise<String[]>,但实际没有任何返回值,函数体末尾缺少return语句;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
相关产品推荐
相关产品推荐

