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
}
*/
答案 0 :(得分:1)
仅与T
与Required<Pick<T, K>>
相交且简化了所需部分的简化方法在这里将无法工作,而这些方法会覆盖T
中的可选属性。 (顺便说一句,因为{ foo?: X } & { foo: X }
本质上是{ foo: X }
才行)
要同时删除可空性,我们必须首先创建一个从给定类型null
中删除undefined
和T
的类型(类似于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'>