打字稿类型 RequireSome<T, K extends keyof T> 从属性中删除 undefined AND null
Typescript type RequireSome<T, K extends keyof T> removing undefined AND null from properties
输入另一个非常相似的问题。这个问题是相似的,但它不应该是重复的,因为在这里我们想要也从属性中删除 null 和 undefined。
也许名称不应该是 Require,而是类似于 NonNullable 或类似的名称。此类型的目标是指定类型中的哪些字段不应为未定义或空值,并且return它们的类型不应为未定义和空值。
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 }
)
为了同时移除可空性,我们必须首先创建一个类型,从给定类型 T
中移除 null
和 undefined
(类似于 Required
)。然后我们需要使用 Omit
类型将我们想要设置为 required 而不是 null 的属性与 T
中的其余键相交。
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'>
也许名称不应该是 Require,而是类似于 NonNullable 或类似的名称。此类型的目标是指定类型中的哪些字段不应为未定义或空值,并且return它们的类型不应为未定义和空值。
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 }
)
为了同时移除可空性,我们必须首先创建一个类型,从给定类型 T
中移除 null
和 undefined
(类似于 Required
)。然后我们需要使用 Omit
类型将我们想要设置为 required 而不是 null 的属性与 T
中的其余键相交。
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'>