打字稿:从类型中排除所有必需的属性
Typescript: Excluding all required properties from a type
如何在以下代码中定义类型 ExcludeAllRequiredProps<T>
以排除(如名称所示)所有必需的属性?提前致谢。
type A = {
a: number,
b: number,
c?: number,
d?: number
}
type B = ExcludeAllRequiredProps<A>
// B shall be { c?: number, d?: number }
[编辑 - 稍后]
您认为这是一个合适的解决方案吗?
type ExcludeAllRequiredProps<T> = {
[K in keyof T]?: T extends Record<K, T[K]> ? never : T[K]
}
您的解决方案很接近,但它保留了那些额外的键,即使它们是 never
类型也可能会造成混淆。此解决方案将从结果中删除不需要的键:
type ExcludeAllRequiredProps<T> = Pick<T, {
[K in keyof T]-?: T extends Record<K, T[K]> ? never : K
}[keyof T]>
type A = {
a: number,
b: number,
c?: number,
d?: number
}
type B = ExcludeAllRequiredProps<A> // { c?: number, d?: number }
如何在以下代码中定义类型 ExcludeAllRequiredProps<T>
以排除(如名称所示)所有必需的属性?提前致谢。
type A = {
a: number,
b: number,
c?: number,
d?: number
}
type B = ExcludeAllRequiredProps<A>
// B shall be { c?: number, d?: number }
[编辑 - 稍后]
您认为这是一个合适的解决方案吗?
type ExcludeAllRequiredProps<T> = {
[K in keyof T]?: T extends Record<K, T[K]> ? never : T[K]
}
您的解决方案很接近,但它保留了那些额外的键,即使它们是 never
类型也可能会造成混淆。此解决方案将从结果中删除不需要的键:
type ExcludeAllRequiredProps<T> = Pick<T, {
[K in keyof T]-?: T extends Record<K, T[K]> ? never : K
}[keyof T]>
type A = {
a: number,
b: number,
c?: number,
d?: number
}
type B = ExcludeAllRequiredProps<A> // { c?: number, d?: number }