簡體   English   中英

當排除擴展接口時,打字稿為什么給出類型“從不”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM