为什么打字稿允许将匿名类型转换为对象,即使该类型与对象属性不匹配



在我的打字稿代码中,我只需要用新值更新类的一个属性。

export class ValidationState {
isLabourComponentValid: boolean = true;
isTableValid: boolean = true;
isFaultCausingPartValid: boolean = true;

public mergeValues(newValue: ValidationState){
Object.assign(this, newValue);
return this;
}
}

用法是:我只向合并函数发送一个属性,我强制转换该属性以匹配所需的类型,即使不是该类型,但打字稿让我这样做。

ValidationState.mergeValues({isLabourComponentValid: false} as ValidationState);
ValidationState.mergeValues({isTableValid: false} as ValidationState);

结果是,验证类已正确更新,新类值为:{false, false, true}。 一切都运行良好,我可以使用新属性扩展类,并通过合并函数对其进行更新,我不需要关心进一步合并。怎么样,这是好方法吗? 另一种方法是逐个属性手动更新,这也是类型安全的。

这工作正常,但更干净的方法是接受Partial<ValidationState>作为mergeValues()的参数。你不再需要类型断言(这只是告诉编译器的一种方式:相信我,我知道我在做什么(。

你可以让mergeValues函数的参数成为Partial<ValidationState>,而不是强制转换。

当你投射时,你告诉 TypeScript 盲目地相信你发送的内容是正确的。使用Partial会给你更多的类型安全性,因为 TypeScript 至少会检查传入的内容是ValidationState的子集。

最新更新