打字稿类型RequireSome <t,k =“” extends =“” keyof =“” t =“”>从属性中删除未定义的AND null

时间:2019-04-15 06:30:58

标签: typescript types nullable non-nullable required-field

RequireSome来自另一个非常相似的问题。这个问题是相似的,但是不能重复,因为在这里我们要还从属性中删除空以及未定义。

也许这个名字不应该是Require,而是类似NonNullable之类的名称。此类型的目标是指定类型中的哪些字段不应为undefined或null,并返回其类型为undefined和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
}

*/

1 个答案:

答案 0 :(得分:1)

仅与TRequired<Pick<T, K>>相交且简化了所需部分的简化方法在这里将无法工作,而这些方法会覆盖T中的可选属性。 (顺便说一句,因为{ foo?: X } & { foo: X }本质上是{ foo: X }才行)

要同时删除可空性,我们必须首先创建一个从给定类型null中删除undefinedT的类型(类似于Required)。然后,我们需要使用T类型,将要设置的属性与Omit中的其余键相交,并且不为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'>