Estou trabalhando com um projeto legado JavaScript que usa a estrutura React. Temos lá algum componente React definido que eu gostaria de reutilizar em um projeto TypeScript React totalmente diferente.
O componente JS React é definido no arquivo controls.jsx e tem a seguinte aparência:
export class MyComponent extends React.Component {
render() {
return <h1>Hi from MyComponent! Message provided: {this.props.message}</h1>;
}
}
No meu projeto TypeScript React, estou tentando usá-lo assim:
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")
);
mas estou recebendo o seguinte erro:
As mensagens de erro dizem:
O tipo de elemento JSX 'MyComponent' não é uma função construtora para elementos JSX. O tipo 'MyComponent' não possui as seguintes propriedades do tipo 'ElementClass': context, setState, forceUpdate, props e 2 more.ts (2605) A classe de elemento JSX não suporta atributos porque não possui uma propriedade 'props'. (2607)
Eu já tentei a solução com o arquivo de digitações personalizadas descrito nesta pergunta, mas isso não muda nada.
Eu entendo que o componente JS tem algumas propriedades de tipo forte exigidas pelo TypeScript ausentes, mas no meu tsconfig.json tenho o allowJs definido como true :
{
"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"
]
}
então eu esperava que funcionasse ...
Obrigado pela ajuda
fonte
Respostas:
Você deve ligar
allowSyntheticDefaultImports
paratrue
desde Reagir não exporta padrão.(fonte: https://github.com/facebook/react/blob/master/packages/react/index.js )
Além disso, você deve adicionar a forma para adereços de componentes. Por exemplo, no seu código:
fonte
allowSyntheticDefaultImports
paratrue
nada muda, ainda estou recebendo o mesmo erro. Não consigo adicionar forma aos acessórios de componentes, porque ele está definido em um arquivo .jsx e estou recebendo o seguinte erro: "'argumentos de tipo' podem ser usados apenas em um arquivo .ts file.ts (8011)"Aqui estão as configurações para você referência que eu estou usando no meu aplicativo de exemplo.
tsconfig.json
package.json
Eu não usei o webpack.
fonte
Na minha opinião, você tem duas opções:
controls.jsx
nomeadocontrols.t.ds
.Esta opção tem duas maneiras de fazer isso. O mais fácil é apenas exportar uma função com o nome de
MyComponent
:O segundo é exportar uma variável que imita a estrutura de classe de um componente:
E então no seu arquivo que deseja usar
MyComponent
, você o importaria desse novo arquivo.Essas são soluções realmente grosseiras, mas acredito que seja a única solução, pois o TypeScript não permite definir um módulo que seja relativo ao seu projeto:
Espero que isto ajude.
fonte
message
destring
tipo para o componente (MyComponent extends React.Component<{ message: string }>
e Código VS não me dá nenhum erro ao importar este componente do novo arquivo. No entanto, ainda estou recebendo um erro de compilação no novo arquivo:Module not found: Error: Can't resolve '../../../../JS_TS_Project/Scripts/application/controls'