Как быть со специально «длинными» интерфейсами?

Учитывая следующий интерфейс, скажем, с 10 или более свойствами

export interface EmployeeFilter {
  name: string;
  gender: string;
  age: number;
  from: Date;
  to: Date;
  module: string;
  position: string;
  phone: string;
  email: string;
  country: string;
}

Есть ли способ инициализировать объект с подписью EmployeeFilter без явной установки свойств?

At the moment I have to manually initialize the properties:

const searchby: EmployeeFilter = {
  name: '',
  gender: '',
  age: 28,
  from: null,
  to: null,
  module: '',
  position: '',
  phone: '',
  email: '',
  country: ''
}

Поэтому я ищу подход, который автоматически инициализирует все свойства EmployeeFilter, установив их как null. Я пробовал некоторые идеи, такие как:

const searchby: EmployeeFilter = new class implements EmployeeFilter{}();

Но, например, делая console.info(searchby); все, что я получаю, это литерал пустого объекта {}.

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


48
2

Ответы:

Решено

Интерфейсы существуют только в системе типов, а типы TypeScript никогда не могут влиять на создаваемый JavaScript.

Следовательно, это совершенно невозможно, основываясь только на интерфейсе.

Однако вы можете заменить интерфейс классом.


Вы можете создать фабричный класс, который будет возвращать объекты типа EmployeeFilter. Вы также можете пометить все поля в интерфейсе EmployeeFilter как необязательные, например. name?: string; и т. д. Затем, когда вам понадобится какой-либо EmployeeFilter, фабрика может вернуть его со значениями по умолчанию. Вы не можете создать экземпляр интерфейса или каким-то образом привести его к классу, потому что интерфейсы не существуют в среде выполнения. Они существуют только во время компиляции для проверки типов.