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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:30:04