与打字稿中的"选择"相反

Edu*_*ard 8 typescript

我正在尝试组合一个类型,与之类似Pick,它将从对象类型中删除某些属性.

它应该这样工作:

type ObjectType = { 
    key1: number, 
    key2: string, 
    key3: boolean, 
    key4: number[] 
}

let obj: Remove<ObjectType, 'key2' | 'key4'>
Run Code Online (Sandbox Code Playgroud)

这里obj的类型应该是:{key1:number,key3:boolean}

Jos*_*ker 18

从 TypeScript 3.5 开始,有一个Omit帮助程序可以按照您的描述工作。

type ObjectType = { 
    key1: number, 
    key2: string, 
    key3: boolean, 
    key4: number[] 
}

let obj: Omit<ObjectType, 'key2' | 'key4'> // type is { key1: number, key3: boolean }
Run Code Online (Sandbox Code Playgroud)

对于旧版本的 TypeScript (>2.8),您可以使用Eduard 在他的回答中提到的Pick和的组合Exclude

我经常创建一个辅助类型来使事情不那么冗长(注意这是 TS 3.5 中使用的确切定义)

type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
Run Code Online (Sandbox Code Playgroud)


Edu*_*ard 16

如果我们需要删除的属性key2key4,这将工作:

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

let obj: Without<ObjectType, 'key2' | 'key4'>
Run Code Online (Sandbox Code Playgroud)

阐述:

Exclude<keyof T, K> 回报 'key1' | 'key3'

Pick<T, Exclude<keyof T, K>> 返回所需的结果 { key1: number, key3: boolean }

  • 你可以将`keyof Pick <T,K>`简化为'K`. (3认同)