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

TypeScript异步代码类型不匹配问题:Promise相关报错排查

问题原因及解决方案

第一个错误:Property 'id' does not exist on type 'Promise<FirmDoc>'

buildFirm是异步函数,调用时未加await,直接赋值const firm = buildFirm()得到的是Promise对象,而非FirmDoc实例。Promise对象没有id属性,因此触发报错。

第二个错误:Type '() => Promise<string[]>' is not assignable to type '() => string[]'

全局声明的signin函数返回类型是string[],但将其改为async函数后,默认返回Promise<string[]>,两者类型不兼容,导致类型校验失败。


具体修改步骤

  1. 更新全局类型声明
    在setup.ts中,将signin的返回类型从string[]改为Promise<string[]>:

    declare global {
      var signin: () => Promise<string[]>;
    }
    
  2. 修正global.signin函数
    将signin改为async函数,内部使用await获取Firm实例,同时去掉手动创建Promise的冗余代码(async函数会自动将返回值包装为Promise):

    global.signin = async () => {
      const firm = await buildFirm(); // 加await获取实际Firm实例
    
      const payload = {
        id: new mongoose.Types.ObjectId().toHexString(),
        email: "test@test.com",
        name: 'Test Name',
        firmId: firm.id,   // 现在可正常访问实例的id属性
        root: false,
      };
    
      const token = jwt.sign(payload, process.env.JWT_KEY!);
      const session = { jwt: token };
      const sessionJSON = JSON.stringify(session);
      const base64 = Buffer.from(sessionJSON).toString("base64");
    
      return [`session=${base64}`]; // async函数自动包装为Promise<string[]>
    };
    
  3. 可选:显式声明FirmDoc的id属性
    若仍存在id属性类型提示问题,可在firm.ts的FirmDoc接口中显式添加id属性(对应mongoose文档的虚拟id属性,是_id的字符串形式):

    export interface FirmDoc extends mongoose.Document {
      id: string; // 显式声明id属性
      domain: string[];
      status: FirmStatus;
      name: string;
      type: string;
      users: string[];
      companies: string[];
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:35:18