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



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

假设我们有:

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

使用NonNullable内置类型:

type NonNullable<T> = Exclude<T, null | undefined>;  // Remove null and undefined from T

参见TypeScript:文档-实用程序类型

感谢@artem,解决方案是:

type NoUndefinedField<T> = { [P in keyof T]-?: NoUndefinedField<NonNullable<T[P]>> };

注意[P in keyof T]-?中的-?语法,它删除了可选性

如今,您可以使用Required来完成您需要的任务:

Required<Type1>

这将导致所有字段都变成非可选字段。更多详细信息可以在这里找到

@DShook的答案是不正确的(或者说是不完整的(,因为OP要求从类型属性中删除null和undefined,而不是从类型本身中删除(这是一个明显的区别(。

虽然@Fartab的答案是正确的,但我会添加它,因为现在有内置的Required类型,解决方案可以重写为:

type RequiredProperty<T> = { [P in keyof T]: Required<NonNullable<T[P]>>; };

这将映射类型属性(而不是类型本身(,并确保每个属性都不是;null或未定义。

从类型中删除null和undefined与从类型属性中删除它们(使用上面的RequiredProperty类型(之间的区别示例:

type Props = {
prop?: number | null;
};
type RequiredType = NonNullable<Props>; // { prop?: number | null }
type RequiredProps = RequiredProperty<Props>; // { prop: Required<number> } = { prop: number }

@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>;
};

有些答案对我不起作用,我最终得到了一个基于顶部答案的类似解决方案:

type RequiredNonNullableObject<T extends object> = { [P in keyof Required<T>]: NonNullable<T[P]>; };

结果如下:

type ObjectType = {
startDateExpr?: string | null;
endDateExpr?: string | null;
startDate?: Date | null;
endDate?: Date | null;
}
type Result = RequiredNonNullableObject<ObjectType>; 

Result类型等于:

type Result = {
startDateExpr: string;
endDateExpr: string;
startDate: Date;
endDate: Date;
}

TypeScript游乐场示例

以下实用程序类型将:

  • 从每个字段中删除可选的属性修饰符(?(
  • 从每个字段中删除nullundefined
  • 仅接受object类型
type RequiredProperty<T extends object> = { [P in keyof T]-?: Required<NonNullable<T[P]>>; };

打字游戏场

相关内容

  • 没有找到相关文章

最新更新