Typescript — динамически расширять интерфейс

#javascript #reactjs #typescript #react-native

#javascript #reactjs #typescript #react-native

Вопрос:

Я пытаюсь ввести существующий модуль React Native со следующими реквизитами:

 useComponent1: boolean
useComponent2: boolean
  

С помощью следующей реализации

 render(){
    if(useComponent1){
        return <Component1 {...props}/>
    }

    if(useComponent2){
        return <Component2 {...props}/>
    }
}
  

У меня есть интерфейс для компонентов 1 и 2, однако я не могу расширить оба, поскольку реквизиты определяются тем, какой компонент используется.

Возможно ли динамически расширять интерфейс?

Если нет, есть ли другое решение этой проблемы?

Ответ №1:

Может быть тип пересечения / объединения:

 interface Component1Props { .... }
interface Component2Props { .... }
interface WrapperOwnProps {
  useComponent1: boolean
  useComponent2: boolean
}
type WrapperProps = WrapperOwnProps amp; (Component1Props | Component2Props);
  

Тип реквизита может быть дополнительно указан:

 class Wrapper extends Component<WrapperProps> {
  render(){
    const { useComponent1, useComponent2, ...props } = this.props;
    if(useComponent1){
      return <Component1 {...props as Component1Props}/>
    }

    if(useComponent2){
      return <Component2 {...props as Component2Props}/>
    }
  }
}