TS2339报错:类型'User | undefined'上不存在属性'admin'如何解决
错误原因
- TypeORM
findOne方法返回值类型为User | undefined:当传入的用户ID不存在时,方法会返回undefined,TypeScript 不允许直接对可能为undefined的值解构admin属性,因此触发TS2339类型错误。 - 现有代码缺失用户存在性校验逻辑,除了类型报错之外,还存在运行时抛出错误、非法用户ID绕过校验的风险。
修复方案
推荐方案(带完整校验,无类型报错)
优先做存在性判断,同时兼容异常场景,修复后代码如下:
import { Request, Response, NextFunction } from "express"; import { getCustomRepository } from "typeorm"; import { UsersRepositories } from "../repositories/UsersRepositories"; export async function ensureAdmin(request: Request, response: Response, next: NextFunction) { // 前置校验user_id是否存在 if (!request.user_id) { return response.status(401).json({ error: "Unauthorized!" }); } const usersRepositories = getCustomRepository(UsersRepositories); const user = await usersRepositories.findOne(request.user_id); // 先判断用户是否存在,再校验管理员权限 if (user?.admin) { return next(); } return response.status(401).json({ error: "Unauthorized!" }); }
临时兼容方案(仅消除类型报错,不推荐生产环境使用)
如果你能100%确定前置逻辑已经保证用户ID一定存在且有效,可以使用非空断言跳过类型校验:
// 仅修改解构行即可 const { admin } = await usersRepositories.findOne(user_id)!;
额外注意事项
如果你使用的是 TypeORM 0.3.x 及以上版本,旧版传参方式已经废弃,需要修改findOne的传参格式,否则也会触发类型报错:
// 0.3.x 版本正确写法 const user = await usersRepositories.findOne({ where: { id: request.user_id } });
内容的提问来源于stack exchange,提问作者Cesar Villela
相关产品推荐
相关产品推荐

