Как проверить, имеет ли универсальный тип свойство по имени в typescript?

#typescript

#typescript

Вопрос:

У меня есть приведенный ниже код в typescript. В теле функции я хотел бы проверить key , существует ли каждый event из них в типе T . Как я могу это сделать в typescript ?

 export const convert = <T>(event: { [key: string]: any }) => {
   // how can I check whether each key in event exists in type T
}
  

В этой функции я хотел бы сохранить таблицу event в Postgresql, поэтому я хотел бы отфильтровать поля, которых нет в столбцах таблицы.

Если T удаляется после компиляции, могу ли я использовать a class для этого?

Как и в приведенном ниже классе, он сопоставляется столбцам таблицы базы данных. Могу ли я отфильтровать поля в на event основе полей, объявленных в этом классе?

 class Entity {
   @column()
   id!: string;
   @column
   name? : string;
  

Комментарии:

1. Вы не можете, потому что типы удаляются во время компиляции (нет информации о T существовании во время выполнения)

2. Что именно вы хотите? Что вы хотите получить в результате этой проверки? Введите или чтобы иметь возможность переносить код в это условие?

3. Даже в случае ключей класса они не будут частью prototype, и вы не сможете запросить их

Ответ №1:

рассмотрите следующее, но event оно также должно быть введено

 export const convert = <T extends Record<string, unknown>>(event: Record<keyof T, unknown>) => {
  

Комментарии:

1. event передается из шлюза API через http. Поэтому у меня нет способа ограничить тип для этого. Если событие имеет полей больше, чем T имеет, оно будет включать эти ненужные поля, верно?

2. в этом случае typescript вам не поможет. во время выполнения нет typescript, он компилируется в чистый js. итак, вам нужно реализовать логику выполнения.