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[]>,两者类型不兼容,导致类型校验失败。
具体修改步骤
更新全局类型声明
在setup.ts中,将signin的返回类型从string[]改为Promise<string[]>:declare global { var signin: () => Promise<string[]>; }修正
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[]> };可选:显式声明
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
相关产品推荐
相关产品推荐

