亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從類型中排除屬性

從類型中排除屬性

慕斯709654 2019-10-17 10:35:05
我想從類型中排除單個屬性。我怎樣才能做到這一點?例如我有interface XYZ {  x: number;  y: number;  z: number;}我想排除財產z以獲得type XY = { x: number, y: number };
查看完整描述

3 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

適用于3.5以上的TypeScript版本

在TypeScript 3.5中,Omit類型已添加到標準庫中。請參閱以下示例以了解如何使用它。


對于3.5以下的TypeScript版本

在TypeScript 2.8中,該Exclude類型已添加到標準庫中,該標準庫允許將省略類型寫為:


type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

對于2.8以下的TypeScript版本

您不能Exclude在2.8以下的版本中使用該類型,但是可以使用它來替代它,以便使用與上述相同的定義。但是,此替換僅適用于字符串類型,因此其功能不如Exclude。


// Functionally the same as Exclude, but for strings only.

type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]

type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>

并使用該類型的示例:


interface Test {

    a: string;

    b: number;

    c: boolean;

}


// Omit a single property:

type OmitA = Omit<Test, "a">; // Equivalent to: {b: number, c: boolean}


// Or, to omit multiple properties:

type OmitAB = Omit<Test, "a"|"b">; // Equivalent to: {c: boolean}


查看完整回答
反對 回復 2019-10-17
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

使用打字稿2.8,您可以使用新的內置Exclude類型。在2.8版本說明實際上在節“預定義條件類型”提到這一點:


注意:Exclude類型是此處建議的Diff類型的正確實現。[...]我們沒有包含Omit類型,因為它的形式很簡單Pick<T, Exclude<keyof T, K>>。


將此應用于您的示例,XY類型可以定義為:


type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>


查看完整回答
反對 回復 2019-10-17
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

我找到了聲明一些變量并使用傳播運算符來推斷類型的解決方案:


interface XYZ {

  x: number;

  y: number;

  z: number;

}


declare var { z, ...xy }: XYZ;


type XY = typeof xy; // { x: number; y: number; }

它有效,但是我很高興看到更好的解決方案。


查看完整回答
反對 回復 2019-10-17
  • 3 回答
  • 0 關注
  • 1194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號