与打字稿中的“选择”相反

时间:2018-09-26 14:53:57

标签: typescript

我正在尝试编写一种类型,与Pick不同的是,该类型将从对象类型中删除某些属性。

它应该这样工作:

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

let obj: Remove<ObjectType, 'key2' | 'key4'>

obj的类型应为:{key1:数字,key3:布尔值}

3 个答案:

答案 0 :(得分:10)

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

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

let obj: Without<ObjectType, 'key2' | 'key4'>

详细说明:

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

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

答案 1 :(得分:1)

从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 }

对于较早版本的TypeScript(> 2.8),您可以使用PickExclude的组合,如爱德华在回答中提到的那样。

我经常使用辅助类型来使事情变得不太冗长(请注意,这是TS 3.5中使用的确切定义)

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

答案 2 :(得分:0)

您可以使用'utility-types'省略泛型。

import { Omit } from "utility-types"

interface IHouse {
    rooms: number 
    gardenSize: number
    toilets: number
}

type Appartment = Omit<IHouse, "gardenSize">