Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@bem-react/di: добавить возможность типизировать множество ключей компонентов, которые хранятся в регистре #397

Closed
devsnice opened this issue Feb 15, 2019 · 4 comments

Comments

@devsnice
Copy link

В текущей реализации, компоненты хранятся в регистре с интерфейсом

interface IRegistryComponents {
    [key: string]: any;
}

Предлагаю добавить возможность типизировать множество ключей, чтобы при использовании можно было избежать ошибок:

  1. указания неправильного названия ключа (опечатки, и т.д)
  2. повтора ключей в регистре

Это позволит хранить интерфейс в одном месте и удобно работать с этим в клиентском приложении, уменьшить количество ошибок и улучшить поддерживаемость кодовой базы

Пример использования

registry.ts

export enum PlatformComponentsEnum {
  'Header' = 'Header',
  'MainSlider' = 'MainSlider'
}

const platformRegistry = new Registry<PlatformComponentsEnum>({ id: APP_PLATFORM_REGISTRY });

app.tsx

 {registry => {
      const Header = registry.get(PlatformComponentsEnum.Header);

      return (
          <Header />
      );
 }}
@devsnice devsnice changed the title @bem-react/di: добавить возможность типизировать множество ключей компонент, которые хранятся в регистре @bem-react/di: добавить возможность типизировать множество ключей компонентов, которые хранятся в регистре Feb 15, 2019
@yarastqt
Copy link
Member

Привет! Сейчас уже реализовано нечто похоже в типизированном консьюмере ComponentRegistryConsumer, но только не через enum. Вот пример:

interface IComponentRegistry {
  Control: typeof Control
}

<ComponentRegistryConsumer id={cn()}>
  {({ Control }: IComponentRegistry) => (
      <Control />
  )}
</ComponentRegistryConsumer>

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

interface IComponentRegistry {
  Control: typeof Control
}

const registry = registries[cn()]
const { Control } = registry.snapshot<IComponentRegistry>()

Так же у нас есть задача на то, чтобы проверять правильность устанавливаемых ключей на основании интерфейса: #386

@yarastqt
Copy link
Member

@devsnice Тебе подходит такое решение? :)

@yarastqt
Copy link
Member

@devsnice ping

@yarastqt
Copy link
Member

yarastqt commented Apr 9, 2019

Закрываю, т.к. нету никакой активности, если есть что-то, то давай в #386

@yarastqt yarastqt closed this as completed Apr 9, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants