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}

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">>

TA貢獻2003條經驗 獲得超2個贊
我找到了聲明一些變量并使用傳播運算符來推斷類型的解決方案:
interface XYZ {
x: number;
y: number;
z: number;
}
declare var { z, ...xy }: XYZ;
type XY = typeof xy; // { x: number; y: number; }
它有效,但是我很高興看到更好的解決方案。
- 3 回答
- 0 關注
- 1194 瀏覽
添加回答
舉報