Игнорировать определенные свойства в интерфейсе при создании объекта в typescript?

#typescript

#typescript

Вопрос:

У меня есть интерфейс, определенный с некоторыми свойствами. Я хочу создать объект из этого интерфейса, однако при создании я не хочу полностью инициализировать все свойства, упомянутые в интерфейсе. Я просто хочу инициализировать несколько. Как я могу этого добиться? Спасибо.

 export interface Campaign {
  id: string;
  name: string;
  createdOn: string;
  lastUpdated: string;
  createdBy: User;
  type: CampaignType;
  status: CampaignStatus;
  startDate: string;
  endDate: string;
  budget: number;
  description: string;
  account: Account;
}
 

я хочу создать массив объектов campaign.
это то, что я пытаюсь сделать.

 let campaigns: Campaign[] = [
    {  id:"1",
       name: "test campaign"
      }

   ];
 

однако я получаю следующую ошибку.

В типе ‘{id: string; name: string; }’ отсутствуют следующие свойства из типа ‘Campaign’: CreatedOn, lastUpdated, CreatedBy, type и еще 6.ts(2740)

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

1. Но почему? Если объект реализует интерфейс X , я ожидаю, что он будет иметь все свойства и методы, определенные интерфейсом X . Зачем еще мне вообще использовать интерфейс?

2. это только для тестирования.

Ответ №1:

вы можете использовать частичное —

 let campaigns: Partial<Campaign>[] = [
    {  id:"1",
       name: "test campaign"
      }

   ];
 

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

1. хорошо, это круто, люблю TS за его подход «только правильное количество ввода» — мне не всегда нужны все 8 свойств в APIGatewayProxyEvent (например, для теста)

Ответ №2:

если вы сделаете необязательные свойства обнуляемыми, это должно сработать.

пример:

 type User = {
  firstName: string;
  lastName?: string;
};

// We can assign a string to the "lastName" property
let john: User = { firstName: "John", lastName: "Doe" };

// ... or we can explicitly assign the value undefined
let jane: User = { firstName: "Jane", lastName: undefined };

// ... or we can not define the property at all
let jake: User = { firstName: "Jake" };
 

Ответ №3:

Вы можете пометить свойства, для которых вы не хотите устанавливать значение при создании, как необязательные, выполнив { propName?: propType }

или, если вы хотите пометить все свойства как необязательные, вы можете использовать Partial

 Partial<{
  prop1: string,
  prop2: number,
}>