Essa é uma confusão entre construtores e instâncias .
Lembre-se de que quando você escreve um componente no React:
class Greeter extends React.Component<any, any> {
render() {
return <div>Hello, {this.props.whoToGreet}</div>;
}
}
Você o usa desta maneira:
return <Greeter whoToGreet='world' />;
Você não o usa desta maneira:
let Greet = new Greeter();
return <Greet whoToGreet='world' />;
No primeiro exemplo, estamos divulgando Greeter
a função construtora do nosso componente. Esse é o uso correto. No segundo exemplo, estamos passando uma instância de Greeter
. Isso está incorreto e falhará em tempo de execução com um erro como "Objeto não é uma função".
O problema com este código
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
é que está esperando uma instância de React.Component
. O que você quer uma função que leva um construtor para React.Component
:
function renderGreeting(Elem: new() => React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
ou similarmente:
function renderGreeting(Elem: typeof React.Component) {
return <span>Hello, <Elem />!</span>;
}
@types/react
-los é mais fácil de usarfunction RenderGreeting(Elem: React.ComponentType) { ... }
function renderGreeting(Elem: typeof React.Component)
no ES6?function renderGreeting (Elem: new() => React.SFC<any>){...}
Se assim por que declarar o tipo de SFCs assim:const Hello:React.SFC<any> = (props) => <div>Hello World</div>
, e não:const Hello: new() =>React.SFC<any> = (props) => <div>Hello World</div>
export const BackNavigationTextWrapper = (WrappedComponent: typeof React.Component) => { const BackNavigationTextWrappedComponent = (props, { commonElements = {} }: any) => { return <WrappedComponent {...props} backLabel={commonElements.backLabel || 'Go back to reservation details'} /> }; BackNavigationTextWrappedComponent.type = WrappedComponent.type; return BackNavigationTextWrappedComponent; };
Estou recebendo um erro "A propriedade 'type' não existe no tipo 'typeof Component'".Se você deseja obter uma classe de componente como parâmetro (versus uma instância), use
React.ComponentClass
:fonte
React.ComponentType<any>
tipo para incluí-los.Quando estou convertendo de JSX para TSX e mantemos algumas bibliotecas como js / jsx e convertemos outras para ts / tsx, quase sempre esqueço de alterar as instruções de importação de js / jsx nos arquivos TSX \ TS de
import * as ComponentName from "ComponentName";
para
import ComponentName from "ComponentName";
Se chamar um componente de estilo JSX (React.createClass) antigo do TSX, use
var ComponentName = require("ComponentName")
fonte
tsconfig.json
) paraallowSyntheticDefaultImports
. Veja: typescriptlang.org/docs/handbook/compiler-options.html e discussão aqui: blog.jonasbandi.net/2016/10/…Se você realmente não se importa com acessórios, o tipo mais amplo possível é
React.ReactType
.Isso permitiria passar elementos dom nativos como string.
React.ReactType
abrange todos estes:fonte
Se você estiver usando material-ui , vá para a definição de tipo do componente, que está sendo sublinhada pelo TypeScript. Muito provavelmente você verá algo parecido com isto
Você tem 2 opções para resolver o erro:
1.Add
.default
quando se utiliza o componente em JSX:2. Nomeie o componente que está sendo exportado como "padrão" ao importar:
Dessa forma, você não precisa especificar
.default
sempre que usar o componente.fonte
O seguinte funcionou para mim: https://github.com/microsoft/TypeScript/issues/28631#issuecomment-472606019 Corrigi-o fazendo algo assim:
fonte
No meu caso, eu estava usando
React.ReactNode
como um tipo para um componente funcional em vez deReact.FC
tipo.Neste componente para ser exato:
fonte
Como o @Jthorpe aludiu,
ComponentClass
permite apenas umComponent
ouPureComponent
não umFunctionComponent
.Se você tentar passar um
FunctionComponent
, datilografado lançará um erro semelhante a ...No entanto, usando em
ComponentType
vez deComponentClass
permitir os dois casos. De acordo com o arquivo de declaração de reação, o tipo é definido como ...fonte
No meu caso, estava faltando
new
dentro da definição de tipo.some-js-component.d.ts
Arquivo:e dentro do
tsx
arquivo em que eu estava tentando importar o componente não digitado:fonte
Ao declarar o componente React Class, use em
React.ComponentClass
vez deReact.Component
corrigir o erro ts.fonte
Você pode usar
No entanto, o seguinte funciona?
fonte