Typescript 从接口属性中删除null

Typescript 从接口属性中删除null,typescript,Typescript,我有几个接口描述深层对象的结构。比如: 接口IBar{ a:字符串| null; b:数字|空; } 接口IBaz{ c:字符串| null; d:布尔|空; } 接口IFoo{ 酒吧:IBar; baz:IBaz; } 目前,对于每个属性,我都使用非空断言操作符,比如obj.bar.a。为了避免在需要访问属性的任何地方都这样做,我想用一种方法创建一个新接口,从“叶”接口中“删除”null 换句话说,我想做: 常量obj:DoMagic=getObj(); 使类型变为: { 酒吧:{ a:弦

我有几个接口描述深层对象的结构。比如:

接口IBar{
a:字符串| null;
b:数字|空;
}
接口IBaz{
c:字符串| null;
d:布尔|空;
}
接口IFoo{
酒吧:IBar;
baz:IBaz;
}
目前,对于每个属性,我都使用非空断言操作符,比如
obj.bar.a。为了避免在需要访问属性的任何地方都这样做,我想用一种方法创建一个新接口,从“叶”接口中“删除”
null

换句话说,我想做:

常量obj:DoMagic=getObj();
使类型变为:

{
酒吧:{
a:弦;
b:数字;
},
巴兹:{
c:字符串;
d:布尔型;
}
}

到目前为止,我只找到了
DeepPartial
的解决方案,我认为这与我需要的正好相反<代码>不可为空似乎相关,但我想将其应用于根接口,而不是每个叶。可以这样做吗?

可以使用和键入实用程序

一级深度版本:

type NoNullFields<Ob> = { [K in keyof Ob]: NonNullable<Ob[K]> };
type NoNullIBar = NoNullFields<IBar>;

最重要的是这部分-
Ob[K]扩展对象?非空字段:不可为空
。这意味着,如果字段是一个对象,那么我们递归地在其上使用类型构造函数,如果不是,则将字段设置为不可为空

有趣。如果对象的深度可变,有没有方法进行递归检查?实际情况是,我的示例是一个简化,对象可以有4或5层深。
type NoNullFields<Ob> = { [K in keyof Ob]: Ob[K] extends object 
? NoNullFields<Ob[K]> : NonNullable<Ob[K]> };
type NoNullIBar = NoNullFields<IBar>;