TypeScript: как я могу получить тип, который имеет некоторые части двух отдельных интерфейсов

#javascript #typescript

#javascript #typescript

Вопрос:

итак, у меня есть

 export interface Interface1 {
  relevantProp1: RelevantProp1;
  relevantProp2?: RelevantProp2;
  irrelevantProp1?: SomeRandomType;
  irrelevantProp2?: SomeRandomType;
}

export interface Interface2 {
  relevantProp3: RelevantProp3;
  irrelevantProp3?: SomeRandomType;
  irrelevantProp4?: SomeRandomType;
}
  

два интерфейса. и я хочу ввести объект, подобный этому

 const obj = {
  relevantProp1: //..,
  relevantProp2: //..
  relevantProp3: //..
}
  

таким образом, он имеет части из обоих интерфейсов, но только частично.

Я думал о том, как это сделать, interface Interface3 extends Interface1, Interface2 {} и тип Partial<Interface3>

но я не уверен, что есть лучший способ сделать это

Ответ №1:

Вы можете использовать Pick<Type, 'attr1' | 'attr2' | ...> и объединение ( amp; ) для достижения этой цели:

 type Interface3 = Pick<Interface1, 'relevantProp1' | 'relevantProp2'> amp; Pick<Interface2, 'relevantProp3'>
  

В вашем примере это будет эквивалентно:

 interface Interface3 {
  relevantProp1: RelevantProp1;
  relevantProp2?: RelevantProp2;
  relevantProp3: RelevantProp3;
}
  

Или, альтернативно, использовать Omit<Type, Keys> для удаления нежелательных атрибутов.