Estoy trabajando con un proyecto heredado de JavaScript que usa el marco React. Tenemos definido algún componente React que me gustaría reutilizar en un proyecto TypeScript React totalmente diferente.
El componente JS React se define en el archivo controls.jsx y tiene el siguiente aspecto:
export class MyComponent extends React.Component {
render() {
return <h1>Hi from MyComponent! Message provided: {this.props.message}</h1>;
}
}
En mi proyecto TypeScript React estoy tratando de usarlo así:
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")
);
pero recibo el siguiente error:
Los mensajes de error dicen:
El tipo de elemento JSX 'MyComponent' no es una función constructora para elementos JSX. Al tipo 'MyComponent' le faltan las siguientes propiedades del tipo 'ElementClass': context, setState, forceUpdate, props y 2 more.ts (2605) La clase de elemento JSX no admite atributos porque no tiene una propiedad 'props'. (2607)
Ya probé la solución con el archivo de tipificación personalizado descrito en esta pregunta, pero no cambia nada.
Entiendo que el componente JS tiene algunas propiedades fuertemente tipadas requeridas por falta de TypeScript, pero en mi tsconfig.json tengo los allowJs establecidos en verdadero :
{
"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"
]
}
así que esperaba que funcionara ...
Gracias por tu ayuda
fuente
Respuestas:
Deberías recurrir
allowSyntheticDefaultImports
atrue
desde Reaccionar no exporta de forma predeterminada.(fuente: https://github.com/facebook/react/blob/master/packages/react/index.js )
Además, debe agregar la forma para los accesorios de los componentes. Por ejemplo, en su código:
fuente
allowSyntheticDefaultImports
detrue
los cambios nada, todavía estoy consiguiendo el mismo error. No puedo agregar forma para accesorios de componentes, porque está definido en un archivo .jsx y obtengo el siguiente error: "'argumentos de tipo' solo se pueden usar en un archivo .ts.ts (8011)"Aquí están las configuraciones para su referencia que estoy usando en mi aplicación de muestra.
tsconfig.json
package.json
No he usado webpack.
fuente
A mi modo de ver, tienes dos opciones:
controls.jsx
nombrecontrols.t.ds
.Esta opción tiene dos formas de hacerlo. Lo más fácil es exportar una función con el nombre de
MyComponent
:El segundo es exportar una variable que imita la estructura de clases de un componente:
Y luego, en su archivo que quiere usar
MyComponent
, lo importaría de ese nuevo archivo.Todas estas son soluciones realmente groseras, pero creo que es la única solución, ya que TypeScript no le permite definir un módulo que sea relativo a su proyecto:
Espero que esto ayude.
fuente
message
destring
tipo al componente (MyComponent extends React.Component<{ message: string }>
y VS Code no me da ningún error al importar este componente desde el nuevo archivo. Sin embargo, todavía recibo un error de compilación en el nuevo archivo:Module not found: Error: Can't resolve '../../../../JS_TS_Project/Scripts/application/controls'