从类型的属性中删除null或undefined

时间:2018-10-29 16:34:57

标签: typescript types null undefined

我需要声明一个类型,以便从其属性类型中删除未定义。

假设我们有

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

4 个答案:

答案 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 }