typescript - typescript - 从类型中排除属性

我想从类型中排除单个属性,我怎样才能做到这一点?

例如我有


interface XYZ {


 x: number;


 y: number;


 z: number;


}



我希望将属性z排除在


type XY = { x: number, y: number };



时间:

适用于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版本

你不能在2.8以下版本中使用Exclude类型,但可以为它创建一个替换品,以便使用与上面相同的定义,但是,此替换仅适用于字符串类型,因此它不像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}



使用typeScript 2.8,你可以使用new Exclude类型,实际上,2.8发行说明在"预定义的条件类型"部分提到了这一点:

注意:Exclude类型是此处建议的Diff类型的正确实现。[...]我们没有包含Omit类型,因为它被简单地写成,Pick<T, Exclude<keyof T, K>>

将此应用到例子中,可以将XY类型定义为:


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



在声明了一些变量,并且使用扩展运算符来推断类型的情况下,我找到了解决方案


interface XYZ {


 x: number;


 y: number;


 z: number;


}



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



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



这很有用,但是,我很高兴看到一个更好的解决方案。

如果你更喜欢使用库,请使用ts-essentials 。


import { Omit } from"ts-essentials";



type ComplexObject = {


 simple: number;


 nested: {


 a: string;


 array: [{ bar: number }];


 };


};



type SimplifiedComplexObject = Omit<ComplexObject,"nested">;



// Result:


// {


// simple: number


// }



// if you want to Omit multiple properties just use union type:


type SimplifiedComplexObject = Omit<ComplexObject,"nested" |"simple">;



// Result:


// { } (empty type)



typeScript 3.5

从Typescript 3.5开始,将包含Omit helper:typescript 3.5rcOmit helper类型

你可以直接使用它,在更新时你应该删除你自己的Omit helper定义。

...