2017-02-01 1 views
0

je un PageLayout de composants réagissent écrit dactylographié:réagissent composants étendus et dactylographiées génériques et setState

export interface IPageLayoutProps {...} 
export interface IPageLayoutActions {...} 
export interface IPageLayoutLocalState {...} 

export default 
class PageLayout<P extends IPageLayoutProps & IPageLayoutActions, S extends Object> 
extends React.Component<P, S> 
{ 
    render() { 
     return (...) 
    } 
} 

puis j'essaie d'étendre comme ce composant ceci:

import PageLayout, { IPageLayoutProps, IPageLayoutActions, IPageLayoutLocalState } from './PageLayout' 

export interface IPageLayoutSidebarProps {...} 
export interface IPageLayoutSidebarActions {...} 
interface IPageLayoutSidebarState {sidebarVisible: boolean} 

export default 
class PageLayoutSidebar<P extends IPageLayoutSidebarProps & IPageLayoutSidebarActions & IPageLayoutProps & IPageLayoutActions, S extends IPageLayoutSidebarState & IPageLayoutLocalState> 
extends PageLayout<P, S> 
{ 
    render() { 
     return (...) 
    } 

    toggleSidebar(visible:boolean) { 
     this.setState({ 
      ...this.state, 
      sidebarVisible: visible 
     }) 
    } 
} 

le problème est que J'obtiens une erreur en essayant d'appeler this.setState, il me dit que "les types de propagation ne peuvent être créés qu'à partir de types d'objets". Quelqu'un a-t-il une idée de ce qui pourrait ne pas fonctionner avec l'état et pourquoi je ne peux pas utiliser l'opérateur spread?

+0

Est-ce un moteur d'exécution ou erreur de compilation de temps? –

+0

c'est une erreur du compilateur - (48,18): erreur TS2698: Les types de propagation peuvent uniquement être créés à partir de types d'objet. –

Répondre

0

Essayez d'utiliser simplement:

this.setState({sidebarVisible: visible}) 
+1

Devrait être 'this.setState ({sidebarVisible: visible})' –

+0

Oui, vous avez raison. Merci. J'ai perdu {}. –

+0

semble ne pas fonctionner pour moi. Si je fais cela, j'ai "Argument de type '{sidebarVisible: booléen}' n'est pas assignable au paramètre de type S". Mais si j'affecte d'abord l'état entier à une variable, puis changez la clé de cette variable et passez cette variable à setState, cela fonctionne. –