bem / bem-react

A set of tools for developing user interfaces using the BEM methodology in React
http://bem.github.io/bem-react
Other
440 stars 63 forks source link

@bem-react/di: withRegistry ломает типизацию для компонент без props #396

Closed devsnice closed 5 years ago

devsnice commented 5 years ago

Есть проблема с типизацией при апдейте c 1.0.3 до 1.5.2

Есть компонента, которая оборачивается в контекст, у неё нет определенных props App.js

const AppTemplate: React.FC = () => (
  <div className="App">
    <BrowserRouter>
      <Page>
        <Routes />
      </Page>
    </BrowserRouter>
  </div>
);

export const App = withRegistry(registry)(AppTemplate);

index.js

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

При попытке использовать получаю ошибку тайпскрипта:

TypeScript error: Type '{}' is not assignable to type 'never'.  TS2322

    13 | ReactDOM.render(
    14 |   <Provider store={store}>
  > 15 |     <App />
       |      ^
    16 |   </Provider>,
    17 |   document.getElementById('root')
    18 | );
yarastqt commented 5 years ago

Привет! Про такую проблему знаем, но пока не ясно как лучше починить. Такое поведение было сделано, чтобы при compose корректно выводились типы в таком кейсе:

const Enhanced = compose(
  withSomeModifier, // Тут имеем некий тип TProps 
  withRegistry(registry), // В текущем решении возвращаем never
)
// В результате делаем intersection TProps & never => TProps.
// Если же возвращать значение по умолчанию {}, то в compose получим TProps | {}, т.к. TProps будет являться подтипом {}
yarastqt commented 5 years ago

Если же у тебя есть идеи как это хорошо сделать, то присылай PR или поделись идеей :)

yarastqt commented 5 years ago

Скорее всего проблема пропадет если в #394 решим делать два типа для композиции

awinogradov commented 5 years ago

Починили тут https://github.com/bem/bem-react/issues/394