Express+TypeScript项目中TypeORM实体创建报错求助
解决Express+TypeScript中TypeORM实体的两个错误
1. 装饰器签名不匹配错误
这个错误是因为TypeScript的装饰器版本与TypeORM不兼容导致的——TypeORM依赖旧的实验性装饰器模式,而TS 5.0+默认启用了新的装饰器标准。调整tsconfig.json的编译配置即可解决:
修改compilerOptions部分:
{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true, "decoratorsBeforeExport": false // TS5.0及以上版本必须添加 } }
2. 属性未初始化错误
这个错误来自TypeScript的strictPropertyInitialization严格检查,TS不知道TypeORM会在实体实例化时自动为这些属性赋值,有三种解决方式:
方式一:使用非空断言(推荐)
给每个实体属性添加!符号,明确告诉TS该属性一定会被赋值:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm" @Entity() export class User { @PrimaryGeneratedColumn() id!: number @Column() firstName!: string @Column() lastName!: string @Column() age!: number }
方式二:关闭严格初始化检查(不推荐)
在tsconfig.json中关闭strictPropertyInitialization,会降低类型安全性:
{ "compilerOptions": { "strictPropertyInitialization": false } }
方式三:设为可选属性(不推荐)
将属性改为可选类型(如id?: number),但会导致类型定义不严谨,因为实际数据库中这些属性是存在的。
为什么NestJS中没遇到问题?
NestJS的默认tsconfig.json已经预先配置好了experimentalDecorators、emitDecoratorMetadata,并且默认关闭了strictPropertyInitialization,所以不需要手动调整就能兼容TypeORM的实体写法。
内容的提问来源于stack exchange,提问作者Trephy
相关产品推荐
相关产品推荐

