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.ReactTypecubre 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
.defaultcuando 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
.defaultcada 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.ReactNodecomo tipo para un componente funcional en lugar deReact.FCtipo.En este componente para ser exactos:
fuente
Como aludió @Jthorpe,
ComponentClasssolo permite cualquieraComponentoPureComponentno pero aFunctionComponent.Si intenta pasar un
FunctionComponent, mecanografiado arrojará un error similar a ...Sin embargo, al utilizar en
ComponentTypelugar deComponentClasspermitir ambos casos. Según el archivo de declaración de reacción, el tipo se define como ...fuente
En mi caso me faltaba
newla definición de tipo.some-js-component.d.tsexpediente:y dentro del
tsxarchivo donde estaba tratando de importar el componente sin tipo:fuente
Al declarar el componente React Class, use en
React.ComponentClasslugar deReact.Componententonces solucionará el error ts.fuente
Puedes usar
Sin embargo, ¿funciona lo siguiente?
fuente