2017-10-10 4 views
1

TypScript & Reagieren Neuling hier. Warum schreit TypeScript mich nicht an? constructor(foo: string) Eingangstyp stimmt nicht überein {foo: string}? (Hinweis: Einer von ihnen ist ein String, der andere ein Objekt.)typescript nicht abfangen Typ nicht übereinstimmen (reagieren TSX)

TypeScript wird dies gerne kompilieren, und natürlich wird der resultierende Code explodieren. Ich habe versucht, alle Optionen zu aktivieren, die tsconfig.json zu bieten hat. Ich benutze Typoskript 2.5.3.

Gibt es eine Möglichkeit, wie Typoskript-Konfiguration, Code ändern oder irgendetwas anderes, um den Code zu verhärten, um dies zu vermeiden? Irgendwelche Ideen geschätzt, ist mein Ziel, stabilen Code zu schreiben.

Import * als Reaktion von 'reagieren'; Import * als ReactDOM von 'react-dom';

class App extends React.Component<{ foo: string }, { foo: string }> { 
    // expects string 
    constructor(foo: string) { 
     super(); 
     this.state = { 
      foo: foo 
     } 
    } 
    render() { 
     return <div>{this.state.foo}</div> 
    } 
} 

// Passes object { foo: string } 
ReactDOM.render(<App foo="foo" />, document.getElementById('root')) 

EDIT: vereinfachte Frage

+1

Sie erkennen, dass dies Typoskript nicht, nicht wahr? – Amit

+0

@Amit, jetzt, wo du sagst, ich tue es, aber ich habe es nicht bemerkt, als ich gefragt habe. Vielen Dank. Also, irgendeine Idee für einen richtigen Workflow für JSX -> TS -> JS? – zupa

+0

Nein, persönlich mag ich genau deshalb nicht reagieren. Ich finde diese Syntax umständlich und ablenkend. – Amit

Antwort

1

Sie Ich werde die Compilerbeschwerden bekommen, nach denen du suchst wenn Sie daran denken, die props an super() zu übergeben. Dies ist nur ein Teil React.Component von erstreckt, und should always be done.

enter image description here

+0

Vielen Dank Mike, das war es !!! Du hast meinen Tag mit deiner Hilfe vollkommen gemacht. – zupa

+0

Ich wollte Ihnen eine Prämie geben, aber anscheinend kann ich das erst nach 23 Stunden tun. Dokumentieren Sie es hier, um weitere Antworten zu vermeiden. – zupa

0

Ihr Anliegen:

// WRONG, to work, it should be: 
// constructor(props Props) { 
constructor(foo: string, bar: string) { 
    super(); 
} 

ist ungültig, weil man immer eine Klasse erben können und Ihren eigenen Konstruktor bieten:

class A { 
    constructor(a: number) { } 
} 

class B extends A { 
    // ALLOWED 
    constructor(b: string) { 
    super(123) 
    } 
} 
+0

Danke für die Antwort. Eigentlich ist das nicht mein Problem. Der Konstruktortyp stimmt nicht mit dem Aufruf 'ReactDOM.render (, root)' überein, der ein Objekt und nicht zwei Zeichenfolgen übergibt. – zupa

Verwandte Themen