Да, вы можете определить, являются ли свойства необязательными .Это немного сомнительно с индексными сигнатурами , но у ваших типов их нет, поэтому я не буду беспокоиться о них.
Вот как можно извлечь только ключи необязательных свойств типа объекта
type RequiredKeys<T> = { [K in keyof T]-?:
({} extends { [P in K]: T[K] } ? never : K)
}[keyof T]
И затем вы можете просто проверить, есть ли у них какой-либо из них или нет (если RequiredKeys<T>
- это never
, тогда это не так):
type HasRequiredField<T> = RequiredKeys<T> extends never ? false : true
И это дает желаемые результаты:
type A = HasRequiredField<AllRequired> // true
type B = HasRequiredField<PartiallyRequired> // true
type C = HasRequiredField<Optional> // false
Надежда, которая помогает;удачи!