我创建了一个函数来剥离对象的接口。然而,Typescript(版本3.2.2)现在声称该类型为never
,而它应该是一个带有属性child
的类型。
interface Child extends Parent {
child: string
}
interface Parent {
parent: string
}
const a: Child = { child: "", parent: "" }
const b = removeParent(a);
function removeParent<T extends Parent>(obj: T) {
delete obj.parent;
return obj as Exclude<T, Parent>;
}
// b is now type never...
这是有效的:
function removeParent<T extends Parent>(obj: T) {
delete obj.parent;
type Without<T, K> = Pick<T, Exclude<keyof T, K>>;
return obj as Without<T, "parent">;
}
然而,我需要一个通用解决方案,不需要我写出要排除的类型。
Exclude
的真正用途是从联合类型中移除分支。例如Exclude<string|null|void, null|void>
⇒string
,或者从keyof
类型中排除元素,就像在这个答案中所示。 - Jesse HallettOmit<T, Parent 的 keyof>
。 - Lucas Kuhlemann