Esta es una confusión entre constructores e instancias .
Recuerde que cuando escribe un componente en React:
class Greeter extends React.Component<any, any> {
render() {
return <div>Hello, {this.props.whoToGreet}</div>;
}
}
Lo usas de esta manera:
return <Greeter whoToGreet='world' />;
No lo usas de esta manera:
let Greet = new Greeter();
return <Greet whoToGreet='world' />;
En el primer ejemplo, estamos pasando Greeter
, la función constructora de nuestro componente. Ese es el uso correcto. En el segundo ejemplo, estamos pasando una instancia de Greeter
. Eso es incorrecto y fallará en tiempo de ejecución con un error como "El objeto no es una función".
El problema con este código
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
es que está esperando una instancia de React.Component
. Para qué quieres una función que tome un constructor para React.Component
:
function renderGreeting(Elem: new() => React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
o similarmente:
function renderGreeting(Elem: typeof React.Component) {
return <span>Hello, <Elem />!</span>;
}
@types/react
, es más fácil de usarfunction RenderGreeting(Elem: React.ComponentType) { ... }
function renderGreeting(Elem: typeof React.Component)
en ES6?function renderGreeting (Elem: new() => React.SFC<any>){...}
si es así, ¿por qué declaramos el tipo de SFC como este:const Hello:React.SFC<any> = (props) => <div>Hello World</div>
y no: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; };
Recibo un error "La propiedad 'tipo' no existe en el tipo 'tipo de componente'".Si desea tomar una clase de componente como parámetro (frente a una instancia), use
React.ComponentClass
:fuente
React.ComponentType<any>
tipo en su lugar para incluirlos.Cuando convierto de JSX a TSX y mantenemos algunas bibliotecas como js / jsx y convierto otras a ts / tsx, casi siempre olvido cambiar las declaraciones de importación js / jsx en los archivos TSX \ TS de
import * as ComponentName from "ComponentName";
a
import ComponentName from "ComponentName";
Si llama a un antiguo componente de estilo JSX (React.createClass) desde TSX, utilice
var ComponentName = require("ComponentName")
fuente
tsconfig.json
)allowSyntheticDefaultImports
. Ver: typescriptlang.org/docs/handbook/compiler-options.html y discusión aquí: blog.jonasbandi.net/2016/10/…Si realmente no te interesan los accesorios, entonces el tipo más amplio posible es
React.ReactType
.Esto permitiría pasar elementos dom nativos como una cadena.
React.ReactType
cubre todo esto:fuente
Si está utilizando material-ui , vaya a la definición de tipo del componente, que TypeScript subraya. Lo más probable es que veas algo como esto
Tiene 2 opciones para resolver el error:
1.Agregue
.default
cuando use el componente en JSX:2. Cambie el nombre del componente, que se está exportando como "predeterminado", al importar:
De esta manera, no necesita especificar
.default
cada vez que usa el componente.fuente
Lo siguiente funcionó para mí: https://github.com/microsoft/TypeScript/issues/28631#issuecomment-472606019 Lo soluciono haciendo algo como esto:
fuente
En mi caso, estaba usando
React.ReactNode
como tipo para un componente funcional en lugar deReact.FC
tipo.En este componente para ser exactos:
fuente
Como aludió @Jthorpe,
ComponentClass
solo permite cualquieraComponent
oPureComponent
no pero aFunctionComponent
.Si intenta pasar un
FunctionComponent
, mecanografiado arrojará un error similar a ...Sin embargo, al utilizar en
ComponentType
lugar deComponentClass
permitir ambos casos. Según el archivo de declaración de reacción, el tipo se define como ...fuente
En mi caso me faltaba
new
la definición de tipo.some-js-component.d.ts
expediente:y dentro del
tsx
archivo donde estaba tratando de importar el componente sin tipo:fuente
Al declarar el componente React Class, use en
React.ComponentClass
lugar deReact.Component
entonces solucionará el error ts.fuente
Puedes usar
Sin embargo, ¿funciona lo siguiente?
fuente