打字稿从类型中排除可选字段

时间:2020-05-27 18:14:35

标签: typescript typescript-typings

有一种实用程序类型NonNullable,它将从联合类型中删除undefinednull值。但是我想知道是否有一种方法可以从类型中删除可选字段。

基本上,如果我有这样的类型:

type MyType = {
  thingOne: number,
  thingTwo?: number
};

我希望只能在必填字段中创建类型

type MyRequireds = NonOptional<MyType>;
// which is a type only containing "thingOne"

是否有一些实用程序类可以满足组成的“ NonOptional”实用程序类?

2 个答案:

答案 0 :(得分:1)

一个棘手的解决方案:

type RequiredKeys<T> = {
  [K in keyof T]: ({} extends { [P in K]: T[K] } ? never : K)
}[keyof T];

type NonOptional<T> = Pick<T, RequiredKeys<T>>;

type MyType = {
  thingOne: number,
  thingTwo?: number
};

type MyRequireds = NonOptional<MyType>;

Playground

诀窍是{}扩展了{thingTwo?: number}但没有扩展{thingOne: number}。我最初找到了此解决方案here

答案 1 :(得分:0)

您可以使用波纹管将其压缩为一种类型。

type OmitOptional<T> = { 
  [P in keyof Required<T> as Pick<T, P> extends Required<Pick<T, P>> ? P : never]: T[P] 
}

Playground