reactjs - Hur man använder Flux Container.create i Typescript 2.8
Jag försöker uppdatera mitt react/flux-projekt från TypeScript 2.2 till 2.8.
Jag har följande som definierar en butik med hjälp av container.create-nyttjandefunktionen:
import * as React from 'react';
import { Container } from 'flux/utils';
export let MyContainer = Container.create(class extends React.Component<props, state> {
static getStores() {
return [/* list of stores here*/]
}
static calculateState(prevState: state, props: props): state {
return {hello: true}
}
render() {
return <div>something</div>
}
}, { withProps: true });
Om jag exporterar denna komponent och försöker använda den får jag följande fel:
TS2605: JSX element type 'Component<props, ComponentState>' is not a constructor function for JSX elements.Detta fungerade bra när jag använde TypeScript 2.2, men efter uppdateringen får jag fel överallt där jag försöker använda container-komponenten på detta sätt.
Jag använder @types/react-typningarna version 15.0.28. Här är definitionerna för Flux-containrar.
Svar #1
Tydligen uppstår detta fel med TypeScript 2.6 och framåt. Men jag är inte säker på vilken brytande ändring som orsakar detta beteende, ingen verkar stämma.
Den grundläggande orsaken är denna:
let readOnlyOrVoid: Readonly<void | {}> // resolves to void | Readonly<{}>
let readOnlyOfAny: Readonly<any> // in 2.5 this resolves to any, in 2.6 it does not we still have Readonly<any>
readOnlyOfAny = readOnlyOrVoid; // valid in 2.5, not so in 2.6
Relaterat tillbaka till React, definieras ComponentState i 15.0.23 som :
type ComponentState = {} | void ;
Medan state för en JSX.ElementClass (som utökar React.Component<any, any>) har typen Readonly<any>.
Eftersom Container.create kommer att returnera en omsluten komponent med tillståndet ComponentState stöter vi på precis detta problem att tilldela Readonly<void | {}> (från den omslutna komponenten) till Readonly<any> (från definitionen av JSX.ElementClass)
Den enklaste lösningen är att uppdatera typerna för react till 15.0.39 vilket ersätter definitionen av ComponentState med:
type ComponentState = {};
