Javascript 对象可能是';未定义';在TypeScript中验证后

Javascript 对象可能是';未定义';在TypeScript中验证后,javascript,typescript,Javascript,Typescript,请参阅以下代码。我们有没有一个方便的方法来克服这个问题 接口IAnimal{ 类型?:“动物”;“鸟”; 身体?:{ 腿?:数字; }; } //验证类型和body.legs是否存在 功能验证器(动物:IAnimal){ 如果(!动物| | |!动物.身体| |!动物.身体.腿){ 抛出新错误(“无效”); } console.log(动物、身体、腿);//这里很好 } 功能食品(动物:IAnimal){ 验证器(动物);//我们在这里称之为验证 控制台。日志(动物。身体。腿); //^^^^^

请参阅以下代码。我们有没有一个方便的方法来克服这个问题

接口IAnimal{
类型?:“动物”;“鸟”;
身体?:{
腿?:数字;
};
}
//验证类型和body.legs是否存在
功能验证器(动物:IAnimal){
如果(!动物| | |!动物.身体| |!动物.身体.腿){
抛出新错误(“无效”);
}
console.log(动物、身体、腿);//这里很好
}
功能食品(动物:IAnimal){
验证器(动物);//我们在这里称之为验证
控制台。日志(动物。身体。腿);
//^^^^^^=======>错误:对象可能“未定义”。ts(2532)
}
我知道这可以通过
解决

console.log(animal.body!.legs);//好的
但是如果这是一个大函数,我们需要使用这个
贯穿整个函数,即使在正确的验证之后也是如此,这看起来不太好。

这种错误也很容易发生。有什么方便的方法可以克服这个问题吗?

您的界面
IAnimal
,设置
主体
可空的
,问题不是来自
验证程序
功能。如果需要
body
legs
,则将其设置为required

interface IAnimal {
  type?: "animal" | "bird";
  body: { // remove nullable mark
    legs: number; // ...
  };
}

好。但在这种情况下,我们正在改变数据模型,这并不总是可能的。最终目标是:1)我们有一个适当的数据设计。2) 一旦它被验证,我们就可以开始了,而不是重复地告诉tsc编译器这个变量不是使用
定义的