Проверьте, имеет ли интерфейс обязательное поле - PullRequest
1 голос
/ 19 марта 2019

Можно ли проверить, имеет ли интерфейс обязательное поле, используя условные типы Typescript?

type AllRequired = { a: string; b: string }
type PartiallyRequired = { a: string; b?: string }
type Optional = { a?: string; b?: string }

// Is it possible to change this, so the below works
type HasRequiredField<T> = T extends {} ? true : false

type A = HasRequiredField<AllRequired> // true
type B = HasRequiredField<PartiallyRequired> // true
type C = HasRequiredField<Optional> // false

1 Ответ

1 голос
/ 19 марта 2019

Да, вы можете определить, являются ли свойства необязательными .Это немного сомнительно с индексными сигнатурами , но у ваших типов их нет, поэтому я не буду беспокоиться о них.

Вот как можно извлечь только ключи необязательных свойств типа объекта

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

Надежда, которая помогает;удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...