TypeScript+TypeORM创建用户时报错Property 'password' does not exist on type 'User[]'
错误产生原因
- TypeORM的
Repository.create()方法支持传入单个实体对象或者对象数组,当TypeScript无法确定你传入的req.body是单个对象时,会将返回值的类型推断为User[](用户数组),数组本身不存在password属性,因此触发TS2339类型错误。 - 你当前代码中调用
bcrypt.hash(password, salt)时,password变量未做任何声明定义,运行时也会抛出未定义错误。
解决方法
- 明确标注
user变量的类型为单个User实体,同时可主动构造传入create方法的对象,避免类型推断异常:
// 可选:提前给请求body定义类型,提升类型安全性 interface CreateUserReqBody { firstName: string; lastName: string; email: string; password: string; } export const createUser = async (req: Request, res: Response): Promise<Response> => { const { body } = req as { body: CreateUserReqBody }; try { const emailExists = await getRepository(User).findOne({ where: { email: body.email } }); if (emailExists) { return res.status(400).json({ message: 'User already exists' }); } // 明确指定user类型为User,主动构造参数避免类型推断错误 const user: User = getRepository(User).create({ firstName: body.firstName, lastName: body.lastName, email: body.email, password: body.password }); const salt = await bcrypt.genSalt(10); // 传入正确的密码参数,替换为加密后的值 user.password = await bcrypt.hash(user.password, salt); await getRepository(User).save(user); return res.status(200).json(user); } catch (error) { return res.status(400).json({ message: 'Error creating user' }); } }
- 如果你不想额外定义请求体类型,也可以通过类型断言直接修正
user的类型:
let user = getRepository(User).create(req.body) as User;
修改后即可解决password属性不存在的类型报错。
内容的提问来源于stack exchange,提问作者Diego Rubalcava
相关产品推荐
相关产品推荐

