这个问题已经有了答案:
is there a way to get all required properties of a typescript object
2个答案
有一种类型

{ a: string, b: number, c?: string, d?: number }

如何得到类型
'c' | 'd'

从这里?

最佳答案

最后我找到了基于Typescript how to create type with common properties of two types?的解决方案。

type MappedC<A, B> = {
  [K in keyof A & keyof B]:
  A[K] extends B[K]
    ? never
    : K
};

type OptionalKeys<T> = MappedC<T, Required<T>>[keyof T];

但它的工作就像一个魔术,因为当把这两种类型组合成一个并用所需的替换b时,它就停止工作了。
另一个似乎更稳定的解决方案是:
export type KeysOfType<T, U> = { [K in keyof T]: T[K] extends U ? K : never }[keyof T];
export type RequiredKeys<T> = Exclude<KeysOfType<T, Exclude<T[keyof T], undefined>>, undefined>;
export type OptionalKeys<T> = Exclude<keyof T, RequiredKeys<T>>;

10-08 01:57