2016-05-28 7 views
0

Ich habe eine Frage bezüglich JSX und Typoskript-Integration. Angesichts der folgenden Code:Verwendung von ReactType mit JSX

interface Props { 
    component?: React.ReactType 
} 

class MyComponent extends React.Component<Props, void> { 
    render() { 
     var Comp = this.props.component 
     return (<Comp></Comp>) 
    } 
} 

ich: JSX element type 'Comp' does not have any construct or call signatures.

Wie kann ich dieses Problem beheben? Ein ähnlicher Code funktioniert gut in Javascript, wo component Prop-Validator elementType von react-prop-types hat, so dass es entweder eine Zeichenfolge oder eine Komponentenklasse sein könnte.

Antwort

0

Wenn Sie sich die Definition von react type in typing ansehen, werden Sie feststellen, dass Sie einen Union-Typ von 3 verschiedenen Typen haben, von denen einer eine Zeichenkette ist. Deshalb hattest du so ein Problem. Versuchen Sie, React.ReactType durch React.ComponentClass zu ersetzen.

+0

Aber ich möchte auch eine Zeichenfolge, es ist erlaubt, in Javascript zu reagieren. – user3250645

+0

@ user3250645 dann sollten Sie kein Typoskript verwenden. Es gibt viele korrekte Programme, die Sie nicht eingeben können. Es ist ein Kompromiss, du verlierst ein bisschen Meinungsfreiheit, aber mehr Sicherheit. –

+0

Das Problem hat nichts mit Typoskript als Sprache zu tun. Offensichtlich ist sein Typsystem flexibel genug, um auszudrücken, was benötigt wird (d. H. ReactType). Das Problem ist, dass JSX-Parser in Typescript JSX.Element-Klasse erwartet und ich weiß nicht, wie Brücke zwischen ReactType (was einfache Zeichenfolge bedeuten kann) und JSX.Element (die React.Component erwartet). Ich bin mir sicher, dass es möglich ist. – user3250645

0

Wie erstellen Sie die Komponente, die Sie übergeben? Wenn Sie es so schaffen sollte es funktionieren:

interface MyProps { 
    component?: React.ReactType; 
} 

class TestComponent extends React.Component<void, void> { 
    render() { 
     return <div>Test</div>; 
    } 
} 

class MyComponent extends React.Component<MyProps, void> { 
    render() { 
     const Comp = this.props.component 
     return (<Comp/>); 
    } 
} 


class Parent extends React.Component<{}, {}> { 
    render() { 
     return (
      <MyComponent component={TestComponent}></MyComponent> 
     ) 
    } 
} 

Sie auch ein HTML-Element als String (beispielsweise „div“) passieren könnte, aber ich bin nicht sicher, ob das, was Sie tun wollte.