@igoryusha22

Можно ли делать динамические интерфейсы?

Есть ли в языке поддержка чего-то подобного?

// 1 компонент
interface AnimalProps {
  name: string;
}

const Animal: FC<AnimalProps> = (props) => {
  return <span>{props.name}</span>;
};

// 2 компонент
interface PersonProps {
  age: number;
}

const Person: FC<PersonProps> = (props) => {
  return <span>{props.age}</span>;
};

// затем какой-то другой компонент, который должен возвращать 
// какой-то другой компонент в зависимости от переданного типа,
// и в зависимости от типа, который будет передан
// определялись бы дополнительные наборы
interface ComponentProps {
  type: 'animal' | 'person';

  // smth that depends on type
  // ...
  ...({
    'animal': AnimalProps,
    'person': PersonProps,
  }[this.type]),
}

const Component: FC<ComponentProps> = (props) => {
  switch (props.type) {
    case 'animal':
      return <Animal name={props.name} />;

    case 'person':
      return <Person age={props.age} />;
  }
};

const Usage: FC<ComponentProps> = (props) => {
  // write type then get support
  return <Component type="animal" />;
};
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Alexandroppolus
@Alexandroppolus
кодир
пример

суть:
enum What {
    animal,
    person
}

type AnimalProps = {
    what: What.animal;
    name: string;
};

type PersonProps = {
    what: What.person;
    age: number;
};

type ComponentProps = AnimalProps | PersonProps;
Ответ написан
Комментировать
WblCHA
@WblCHA
interface AnimalProps {
  name: string;
}
interface PersonProps {
  age: number;
}

type ComponentProps = 
    | ({ type: 'animal'; } & AnimalProps)
    | ({ type: 'person'; } & PersonProps)

// or

interface AnimalType extends AnimalProps {
    type: 'animal';
}
interface PersonType extends PersonProps {
    type: 'person';
}

type ComponentProps2 = AnimalType | PersonType;

https://www.typescriptlang.org/play?#code/JYOwLgpg...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы