如何从类型中省略可选属性?

How to omit optional properties from type?

给定一个具有可选属性的对象类型,例如:

interface Person {
  name: string;
  age: number;
  friends?: Person[];
  jobName?: string;
}

…我想删除它的所有可选属性,这样结果是:

interface Person {
  name: string;
  age: number;
}

我该怎么做?


请注意,我不能使用 Omit<Person, "friends" | "jobName">,因为事先不知道实际属性。我必须以某种方式收集所有可选属性的键的并集:

type OptionalKey<Obj extends object> = {
  [Key in keyof Obj]: /* ... */ ? Key : never;
}[keyof Obj];

type PersonOptionalKey = OptionalKey<Person>;
// "friends" | "jobName"

此外, 命名不当,没有回答我的问题。

虽然方法 proposed in the comments 删除了可选属性,但它也删除了具有 undefined 作为其类型的可能值的非可选属性。

interface Person {
    required: string;
    optional?: string;
    maybeUndefined: string | undefined
}

/*
type A = { required: string }
*/
type A = ExcludeOptionalProps<Person>

如果您正在寻找一个辅助类型,仅删除 可选的 键,您可以将其写为:

type RequiredFieldsOnly<T> = {
    [K in keyof T as T[K] extends Required<T>[K] ? K : never]: T[K]
}

playground link