我需要声明一个类型,以便从其属性类型中删除未定义的。
假设我们有:
type Type1{
prop?: number;
}
type Type2{
prop: number | undefined;
}
type Type3{
prop: number;
}
我需要定义一个名为NoUndefinedField<T>
的泛型类型,使NoUndefinedField<Type1>
给出与Type3
相同的类型和与NoUndefinedField<Type2>
相同的类型。
我试过这个
type NoUndefinedField<T> = { [P in keyof T]: Exclude<T[P], null | undefined> };
但它只对Type2
有效。
6条答案
按热度按时间qhhrdooz1#
现在还内置了
NonNullable
类型:请参阅类型脚本:文档-实用程序类型
ki1q1bka2#
感谢@阿尔特姆,解决方案是:
请注意
[P in keyof T]-?
中的-?
语法,它删除了可选性nxowjjhe3#
@DShook的回答是不正确的(或者说是不完整的),因为OP要求从类型属性中删除null和undefined,而不是从类型本身中删除(一个明显的区别)。
虽然@Fartab的答案是正确的,但我将补充它,因为现在有了内置的
Required
类型,并且解决方案可以重写为:这将Map类型属性(而不是类型本身),并确保每个属性都不是; null或未定义。
从型别移除null和undefined与从型别属性移除它们(使用上述
RequiredProperty
型别)之间的差异范例:q5iwbnjs4#
在@Fartab和@tim.stasse的回答中,有些东西把
Date
类型的一个属性给弄乱了:我在没有递归的情况下成功地解决了这个问题:
vc6uscn95#
现在你可以使用Required来完成你所需要的事情:
这将导致所有字段变为非可选。更多详细信息可在此处找到
2skhul336#
有些答案对我不起作用,我最终根据排名靠前的答案得出了类似的解决方案:
这将导致以下结果:
Result
类型等于:TypeScriptPlayground示例