Определение требуемого поля машинописного текста во время выполнения

#typescript

Вопрос:

Мне нужен способ определить во время выполнения, требуется ли определенное поле в интерфейсе машинописи.

Это должно выглядеть так:

 interface Person {
  name: string
  age?: number
  occupation?: string
}

const person: Person = {
   // values
}

const fields = ['name', 'age', 'occupation']
fields.map(field => {
  // I'm looking for a kind of `isRequired` TypeScript util,
  // that can tell, whether a field in described interface is required
  if (isRequired(person, field)) {
    // do this
  } else {
    // do that
  }
})
 

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

Кто-нибудь реализовал это?

Ответ №1:

Это невозможно для интерфейсов, потому что они не существуют во время выполнения. Если что-нибудь, что вы могли бы сделать с классом, используя метаданные, но я не знаю, сохранен ли необязательный статус в метаданных по умолчанию.

Если это не так, вам, возможно, придется самостоятельно аннотировать свойства, и в этот момент вы также можете создать сопоставление/массив требуемых свойств вручную.