打字稿类型 RequireSome<T, K 扩展 T 键>从属性中删除未定义的 AND null



Require来自另一个非常相似的问题的某种类型。这个问题是类似的,但它不应该是重复的,因为在这里我们也想从属性中删除 null 和 undefined。

也许名称不应该是必需的,而是像NonNullable或类似的东西。此类型的目标是指定类型中的哪些字段不应为未定义或 null,并返回其类型而不带未定义和 null。

type Question = {
    id: string;
    answer?: string | null;
    thirdProp?: number | null;
    fourthProp?: number | null;
}
// usage NonNullable<Question, 'answer' | 'thirdProp'> expect to equal
/*
type Question = {
    id: string; // no changes
    answer: string; // changed
    thirdProp: number; // changed
    fourthProp?: number | null; // no changes
}
*/

仅与T相交的简化方法与所需部分的Required<Pick<T, K>>相交,所需部分基本上覆盖了T中的可选属性,在这里行不通。(顺便说一下,这是有效的{ foo?: X } & { foo: X }因为本质上是{ foo: X }

要同时删除可空性,我们必须首先创建一个类型,该类型从给定类型中删除nullundefined T(类似于 Required (。然后,我们需要使用 Omit 类型将我们想要成为必需的属性与 T 中的其余键相交,而不是 null。

type Omit<T, K> = Pick<T, Exclude<keyof T, K>> // not needed in ts 3.5
type RequiredAndNotNull<T> = {
    [P in keyof T]-?: Exclude<T[P], null | undefined>
}
type RequireAndNotNullSome<T, K extends keyof T> = 
    RequiredAndNotNull<Pick<T, K>> & Omit<T, K>
type Question = {
    id: string;
    answer?: string | null;
    thirdProp?: number | null;
    fourthProp?: number | null;
}
type T0 = RequireAndNotNullSome<Question, 'answer' | 'thirdProp'> 

相关内容

  • 没有找到相关文章

最新更新