如何从类型中省略可选属性?
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]
}
给定一个具有可选属性的对象类型,例如:
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]
}