![](/img/trans.png)
[英]Why does TypeScript infer the 'never' type when reducing an Array with concat?
[英]Why does typescript give type `never` when excluding extended interface
我創建了一個剝離接口對象的函數。 但是,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<T, Parent>
排除本質上是: type Exclude<T, U> = T extends U ? never : T
type Exclude<T, U> = T extends U ? never : T
結果,由於T在您的用法中擴展了Parent
,因此您的返回類型將never
不會返回。
我認為您真正想要的是: Pick<T, Exclude<keyof T, keyof Parent>>
所以您說的是“選擇T在父級中不存在的所有屬性”
function removeOneAndTwo<T extends Parent>(obj: T): Pick<T, Exclude<keyof T, keyof Parent>> {
delete obj.one;
delete obj.two;
return obj;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.