Ich arbeite mit einem JavaScript-Legacy-Projekt, das das React-Framework verwendet. Wir haben dort eine React-Komponente definiert, die ich in einem völlig anderen TypeScript React-Projekt wiederverwenden möchte.
Die JS React-Komponente ist in der Datei controls.jsx definiert und sieht folgendermaßen aus:
export class MyComponent extends React.Component {
render() {
return <h1>Hi from MyComponent! Message provided: {this.props.message}</h1>;
}
}
In meinem TypeScript React-Projekt versuche ich es so zu verwenden:
import * as React from "react";
import * as ReactDOM from "react-dom";
import { MyComponent } from "../JavaScriptProject/controls";
ReactDOM.render(
<MyComponent message="some nice message"/>,
document.getElementById("documents-tree")
);
aber ich bekomme folgenden Fehler:
Fehlermeldungen sagen:
Der JSX-Elementtyp 'MyComponent' ist keine Konstruktorfunktion für JSX-Elemente. Beim Typ 'MyComponent' fehlen die folgenden Eigenschaften vom Typ 'ElementClass': context, setState, forceUpdate, props und 2 more.ts (2605) Die JSX-Elementklasse unterstützt keine Attribute, da sie keine 'props'-Eigenschaft.ts enthält (2607)
Ich habe die Lösung bereits mit einer in dieser Frage beschriebenen benutzerdefinierten Typisierungsdatei ausprobiert , aber sie ändert nichts.
Ich verstehe, dass die JS-Komponente einige stark typisierte Eigenschaften hat, die von TypeScript benötigt werden, aber in meiner tsconfig.json habe ich die allowJs auf true gesetzt :
{
"compilerOptions": {
"allowJs": true,
"baseUrl": ".",
"experimentalDecorators": true,
"jsx": "react",
"noEmitOnError": true,
"outDir": "lib",
"sourceMap": true,
"target": "es5",
"lib": [
"es2015",
"dom"
]
},
"exclude": [
"node_modules",
"dist",
"lib",
"lib-amd"
]
}
also hoffte ich, dass es funktionieren sollte ...
Danke für Ihre Hilfe
quelle
Antworten:
Sie sollten sich
allowSyntheticDefaultImports
an wenden ,true
da React keine Standardeinstellungen exportiert.(Quelle: https://github.com/facebook/react/blob/master/packages/react/index.js )
Außerdem sollten Sie die Form für Komponentenstützen hinzufügen. Zum Beispiel in Ihrem Code:
quelle
allowSyntheticDefaultImports
zutrue
Änderungen nichts, ich bin immer noch den gleichen Fehler. Ich kann keine Form für Komponenten-Requisiten hinzufügen, da diese in einer .jsx-Datei definiert ist und die folgende Fehlermeldung angezeigt wird: "'Typargumente' können nur in einer .ts-Datei verwendet werden. Tts (8011)"Hier sind die Konfigurationen für Ihre Referenz, die ich in meiner Beispielanwendung verwende.
tsconfig.json
package.json
Ich habe kein Webpack verwendet.
quelle
So wie ich das sehe, haben Sie zwei Möglichkeiten:
controls.jsx
angebencontrols.t.ds
.Diese Option hat zwei Möglichkeiten. Am einfachsten ist es, eine Funktion mit dem Namen zu exportieren
MyComponent
:Die zweite besteht darin, eine Variable zu exportieren, die die Klassenstruktur einer Komponente nachahmt:
Und dann würden Sie in Ihrer Datei, die
MyComponent
Sie verwenden möchten, diese stattdessen aus dieser neuen Datei importieren.Dies sind alles wirklich grobe Lösungen, aber ich glaube, es ist die einzige Lösung, da Sie mit TypeScript kein Modul definieren können, das relativ zu Ihrem Projekt ist:
Hoffe das hilft.
quelle
message
vonstring
Typ zu der Komponente (MyComponent extends React.Component<{ message: string }>
und VS - Code gibt mir keine Fehler , wenn diese Komponente aus der neuen Datei zu importieren. Aber ich bin immer noch einen Compiler - Fehler bekommen in der neuen Datei:Module not found: Error: Can't resolve '../../../../JS_TS_Project/Scripts/application/controls'