Il s'agit d'une confusion entre les constructeurs et les instances .
N'oubliez pas que lorsque vous écrivez un composant dans React:
class Greeter extends React.Component<any, any> {
render() {
return <div>Hello, {this.props.whoToGreet}</div>;
}
}
Vous l'utilisez de cette façon:
return <Greeter whoToGreet='world' />;
Vous ne l' utilisez pas de cette façon:
let Greet = new Greeter();
return <Greet whoToGreet='world' />;
Dans le premier exemple, nous transmettons Greeter
la fonction constructeur de notre composant. C'est l'usage correct. Dans le deuxième exemple, nous transmettons une instance de Greeter
. C'est incorrect et échouera au moment de l'exécution avec une erreur du type "L'objet n'est pas une fonction".
Le problème avec ce code
function renderGreeting(Elem: React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
est qu'il attend une instance de React.Component
. Ce que vous voulez une fonction qui prend un constructeur pour React.Component
:
function renderGreeting(Elem: new() => React.Component<any, any>) {
return <span>Hello, <Elem />!</span>;
}
ou de manière similaire:
function renderGreeting(Elem: typeof React.Component) {
return <span>Hello, <Elem />!</span>;
}
@types/react
, il est plus facile à utiliserfunction RenderGreeting(Elem: React.ComponentType) { ... }
function renderGreeting(Elem: typeof React.Component)
dans ES6?function renderGreeting (Elem: new() => React.SFC<any>){...}
si oui, pourquoi déclarons-nous le type de SFC comme ceci:,const Hello:React.SFC<any> = (props) => <div>Hello World</div>
et non: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; };
J'obtiens une erreur "La propriété 'type' n'existe pas sur le type 'typeof Component'".Si vous souhaitez prendre une classe de composant comme paramètre (par rapport à une instance), utilisez
React.ComponentClass
:la source
React.ComponentType<any>
type à la place pour les inclure.Lorsque je convertis de JSX en TSX et que nous conservons certaines bibliothèques sous le nom js / jsx et convertissons d'autres en ts / tsx, j'oublie presque toujours de changer les instructions d'importation js / jsx dans les fichiers TSX \ TS de
import * as ComponentName from "ComponentName";
à
import ComponentName from "ComponentName";
Si vous appelez un ancien composant de style JSX (React.createClass) depuis TSX, utilisez
var ComponentName = require("ComponentName")
la source
tsconfig.json
) surallowSyntheticDefaultImports
. Voir: typescriptlang.org/docs/handbook/compiler-options.html et discussion ici: blog.jonasbandi.net/2016/10/…Si vous ne vous souciez vraiment pas des accessoires, le type le plus large possible est
React.ReactType
.Cela permettrait de passer des éléments dom natifs sous forme de chaîne.
React.ReactType
couvre tous ces éléments:la source
Si vous utilisez material-ui , accédez à la définition de type du composant, qui est soulignée par TypeScript. Très probablement, vous verrez quelque chose comme ça
Vous avez 2 options pour résoudre l'erreur:
1.Ajouter
.default
lors de l'utilisation du composant dans JSX:2.Renommez le composant, qui est exporté comme "par défaut", lors de l'importation:
De cette façon, vous n'avez pas besoin de spécifier
.default
chaque fois que vous utilisez le composant.la source
Ce qui suit a fonctionné pour moi: https://github.com/microsoft/TypeScript/issues/28631#issuecomment-472606019 Je le corrige en faisant quelque chose comme ceci:
la source
Dans mon cas, j'utilisais
React.ReactNode
comme type pour un composant fonctionnel au lieu deReact.FC
type.Dans ce composant pour être exact:
la source
Comme @Jthorpe y a fait allusion,
ComponentClass
n'autorise que l'unComponent
ou l' autrePureComponent
mais pas unFunctionComponent
.Si vous essayez de passer un
FunctionComponent
, dactylographié générera une erreur similaire à ...Cependant, en utilisant
ComponentType
plutôt queComponentClass
vous autorisez les deux cas. Selon le fichier de déclaration de réaction, le type est défini comme ...la source
Dans mon cas, je manquais
new
dans la définition de type.some-js-component.d.ts
fichier:et dans le
tsx
fichier où j'essayais d'importer le composant non typé:la source
Lors de la déclaration du composant React Class, utilisez
React.ComponentClass
au lieu deReact.Component
puis cela corrigera l'erreur ts.la source
Vous pouvez utiliser
Cependant, est-ce que ce qui suit fonctionne?
la source