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

Dmi*_*sky 3 properties typescript conditional-types

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

\n
interface Person {\n  name: string;\n  age: number;\n  friends?: Person[];\n  jobName?: string;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 我想删除它的所有可选属性,以便结果是:

\n
interface Person {\n  name: string;\n  age: number;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我怎样才能做到这一点?

\n
\n

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

\n
type OptionalKey<Obj extends object> = {\n  [Key in keyof Obj]: /* ... */ ? Key : never;\n}[keyof Obj];\n\ntype PersonOptionalKey = OptionalKey<Person>;\n// "friends" | "jobName"\n
Run Code Online (Sandbox Code Playgroud)\n

另外,打字稿删除可选属性的命名很糟糕,并且不能回答我的问题。

\n

ale*_*xor 7

虽然评论中提出的方法删除了可选属性,但它也删除了具有undefined其类型的可能值的非可选属性。

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

/*
type A = { required: string }
*/
type A = ExcludeOptionalProps<Person>
Run Code Online (Sandbox Code Playgroud)

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

type RequiredFieldsOnly<T> = {
    [K in keyof T as T[K] extends Required<T>[K] ? K : never]: T[K]
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接