我需要声明一个类型,以便从其属性类型中删除未定义。
假设我们有
type Type1{
prop?: number;
}
type Type2{
prop: number | undefined;
}
type Type3{
prop: number;
}
我需要定义一个名为NoUndefinedFeild<T>
的通用类型,以使NoUndefinedFeild<Type1>
的类型与Type3
相同,并且类型与NoUndefinedFeild<Type2>
相同。
我尝试过
type NoUndefinedFeild<T> = { [P in keyof T]: Exclude<T[P], null | undefined> };
但是它仅适用于Type2
。
答案 0 :(得分:2)
@Fartab和@ tim.stasse的答案对我来说都是Date
类型的属性:
// both:
type NoUndefinedField<T> = {
[P in keyof T]-?: NoUndefinedField<NonNullable<T[P]>>;
};
type NoUndefinedField<T> = {
[P in keyof T]-?: NoUndefinedField<Exclude<T[P], null | undefined>>;
};
// throw:
Property '[Symbol.toPrimitive]' is missing in type 'NoUndefinedField<Date>' but required in type 'Date'.ts(2345)
// and
type NoUndefinedField<T> = { [P in keyof T]: Required<NonNullable<T[P]>> };
// throws:
Property '[Symbol.toPrimitive]' is missing in type 'Required<Date>' but required in type 'Date'.ts(2345)
此解决方案在没有递归的情况下取得了成功:
type NoUndefinedField<T> = {
[P in keyof T]-?: Exclude<T[P], null | undefined>;
};
答案 1 :(得分:1)
现在还内置了NonNullable类型:
type NonNullable<T> = Diff<T, null | undefined>; // Remove null and undefined from T
https://www.typescriptlang.org/docs/handbook/advanced-types.html
答案 2 :(得分:0)
感谢@artem,解决方法是:
type NoUndefinedFeild<T> = { [P in keyof T]-?: NoUndefinedFeild<NonNullable<T[P]>> };
请注意-?
中的[P in keyof T]-?
语法删除了可选性
答案 3 :(得分:0)
@DShook的答案是错误的(或者说是不完整的),因为OP要求从类型属性而不是类型本身中删除null和undefined(明显不同)。
虽然@Fartab的答案是正确的,但我将添加它,因为现在有内置的Required
类型,并且解决方案可以重写为:
type RequiredProperty<T> = { [P in keyof T]: Required<NonNullable<T[P]>>; };
这将映射类型属性(而不是类型本身),并确保每个都不是;空或未定义。
从类型中删除null和undefined与从类型属性中删除它们(使用上述RequiredProperty
类型)之间的区别的示例:
type Props = {
prop?: number | null;
};
type RequiredType = NonNullable<Props>; // { prop?: number | null }
type RequiredProps = RequiredProperty<Props>; // { prop: Required<number> } = { prop: number }