Angular7升级至8运行ng serve报TS2739缺少EmployeeModel属性错误怎么解决
报错原因
TS2739属于TypeScript的类型校验报错,Angular7升级到8的过程中,配套的TypeScript版本对类型检查的严格度大幅提升,才会触发原有松散写法的报错:
你在执行对象扩展赋值{...this.employee, ...entry[1]}时,entry[1]的类型被TS推断为{},没有包含EmployeeModel要求的三个必填属性,所以TS判定赋值后的对象不符合EmployeeModel的类型约定。
可行解决方案
- 方案1:使用
Partial类型断言(最推荐,不破坏原有类型定义,也保留校验能力)
修改报错行的代码,告诉TS你确认entry[1]是EmployeeModel的部分属性:
this.employee = {...this.employee, ...entry[1] as Partial<EmployeeModel>};
只要你的后续赋值逻辑能确保所有必填属性最终都会被赋值,这个方案是最优选择。
- 方案2:调整
EmployeeModel接口的必填属性定义
如果statut、hasLaws、disablePlanningManagerOrLeaderOrFixe三个属性本身不需要初始化时就存在,属于后续赋值的可选属性,可以直接修改接口定义,将三个属性标记为可选:
interface EmployeeModel { // 保留你原有其他属性 statut?: string; // 替换为你实际的属性类型 hasLaws?: boolean; disablePlanningManagerOrLeaderOrFixe?: boolean; }
- 方案3:初始化
employee时补全所有必填属性的默认值
只要在执行扩展赋值前,this.employee本身已经包含了三个必填属性的初始值,扩展后也不会出现属性缺失的问题:
// 声明employee时就补全默认值 employee: EmployeeModel = { statut: '', // 按业务需求给对应初始值 hasLaws: false, disablePlanningManagerOrLeaderOrFixe: false, // 其他所有必填属性的初始值 }
- 方案4:临时关闭严格属性初始化校验(仅应急使用,不推荐长期开启)
修改项目根目录的tsconfig.json,添加/修改配置项:
{ "compilerOptions": { "strictPropertyInitialization": false } }
该方案会关闭类属性初始化的严格校验,失去部分类型保护能力,仅适合临时解决问题不建议长期使用。
内容的提问来源于stack exchange,提问作者MohamedJihed Riahi
相关产品推荐
相关产品推荐

