Definitelytyped: react-router: `withRouter` échoue avec` ComponentType` à partir de 3.6.2

Créé le 10 sept. 2019  ·  10Commentaires  ·  Source: DefinitelyTyped/DefinitelyTyped

Cela a fonctionné en 3.5.2, mais échoue en 3.6.2.

strict est désactivé.

Est-ce un bogue dans les typages ou TypeScript?

J'ai ajouté des tests qui ont échoué pour cela ici: https://github.com/DefinitelyTyped/DefinatelyTyped/commit/f036856dfc9a7fd140f378402c102206738ec0a4.

import * as React from 'react';

// Copied from https://github.com/DefinitelyTyped/DefinitelyTyped/blob/5db94ca7fd3570dc23588b404d7bb669a7886a8a/types/react-router/index.d.ts#L146
declare function withRouter<P, C extends React.ComponentType<P>>(
    component: C & React.ComponentType<P>,
): unknown;

declare const Component: React.ComponentType<{}>;
/*
Argument of type 'ComponentType<{}>' is not assignable to parameter of type 'ComponentClass<{}, any> | (ComponentClass<{}, any> & FunctionComponent<{}>)'.
  Type 'FunctionComponent<{}>' is not assignable to type 'ComponentClass<{}, any> | (ComponentClass<{}, any> & FunctionComponent<{}>)'.
    Type 'FunctionComponent<{}>' is not assignable to type 'ComponentClass<{}, any> & FunctionComponent<{}>'.
      Type 'FunctionComponent<{}>' is not assignable to type 'ComponentClass<{}, any>'.
        Type 'FunctionComponent<{}>' provides no match for the signature 'new (props: {}, context?: any): Component<{}, any, any>'.
*/
withRouter(Component);

Si vous savez comment résoudre le problème, faites plutôt une demande d'extraction.

  • [x] J'ai essayé d'utiliser le package @types/xxxx et j'ai rencontré des problèmes.
  • [x] J'ai essayé d'utiliser la dernière version stable de tsc. https://www.npmjs.com/package/typescript
  • [x] J'ai une question qui ne convient pas à StackOverflow . (Veuillez y poser toutes les questions appropriées).
  • [x] [Mentionnez] (https://github.com/blog/821-mention-somebody-they-re-notified) les auteurs (voir Definitions by: in index.d.ts ) afin qu'ils puissent répondre.

    • Auteurs: @ sergey-buturlakin @ mrk21 @ vasek17 @ngbrown @awendland @KostyaEsmukov @johnnyreilly @LKay @DovydasNavickas @ huy-nguyen @grmiade @DaIgeb @egorshulga @rraina @ Pret-a-porter @ t49tran @ 8enSmith @wezleytsai @ eps1lon @HipsterBrown

Si vous ne mentionnez pas les auteurs, le problème sera ignoré.

Bug

Commentaire le plus utile

Je vois toujours des problèmes même après ce correctif. Le message d'erreur est quelque chose comme

 Argument of type '({ myProp, history }: RouteComponentProps<{}, StaticContext, any> & { myProp: boolean; }) => Element' is not assignable to parameter of type 'ComponentType<RouteComponentProps<{}, StaticContext, any>>'.
  Type '({ myProp, history }: RouteComponentProps<{}, StaticContext, any> & { myProp: boolean; }) => Element' is not assignable to type 'FunctionComponent<RouteComponentProps<{}, StaticContext, any>>'.
    Types of parameters '__0' and 'props' are incompatible.
      Type 'PropsWithChildren<RouteComponentProps<{}, StaticContext, any>>' is not assignable to type 'RouteComponentProps<{}, StaticContext, any> & { myProp: boolean; }'.
        Property 'myProp' is missing in type 'RouteComponentProps<{}, StaticContext, any> & { children?: ReactNode; }' but required in type '{ myProp: boolean; }'.

avec le composant défini comme

import { RouteComponentProps, withRouter } from "react-router-dom";

interface Props extends RouteComponentProps {
  myProp: boolean;
}

const Component = ({ myProp, match }: Props) => null

export default withRouter(Component);

j'utilise

typescript: 3.6.3
@types/react-router: 5.0.4

Tous les 10 commentaires

Je n'aurai pas le temps de creuser là-dedans. Je pense que nous devrions simplement supprimer toute utilisation de ComponentType et utiliser des fonctions simples avec des accessoires explicites en ce qui concerne ref et children . ComponentType a toujours été un peu problématique à cause de l'union. S'il ne créait pas d'erreurs, il produisait de très grandes unions avec d'autres hocs. Les consommateurs de bibliothèques ne devraient de toute façon pas toucher à la statique, donc les perdre ne devrait pas être un problème.

J'ai le même problème. Déjà signalé sur le repo react-router (https://github.com/ReactTraining/react-router/issues/6906) mais a été redirigé vers ici.

Je vois toujours des problèmes même après ce correctif. Le message d'erreur est quelque chose comme

 Argument of type '({ myProp, history }: RouteComponentProps<{}, StaticContext, any> & { myProp: boolean; }) => Element' is not assignable to parameter of type 'ComponentType<RouteComponentProps<{}, StaticContext, any>>'.
  Type '({ myProp, history }: RouteComponentProps<{}, StaticContext, any> & { myProp: boolean; }) => Element' is not assignable to type 'FunctionComponent<RouteComponentProps<{}, StaticContext, any>>'.
    Types of parameters '__0' and 'props' are incompatible.
      Type 'PropsWithChildren<RouteComponentProps<{}, StaticContext, any>>' is not assignable to type 'RouteComponentProps<{}, StaticContext, any> & { myProp: boolean; }'.
        Property 'myProp' is missing in type 'RouteComponentProps<{}, StaticContext, any> & { children?: ReactNode; }' but required in type '{ myProp: boolean; }'.

avec le composant défini comme

import { RouteComponentProps, withRouter } from "react-router-dom";

interface Props extends RouteComponentProps {
  myProp: boolean;
}

const Component = ({ myProp, match }: Props) => null

export default withRouter(Component);

j'utilise

typescript: 3.6.3
@types/react-router: 5.0.4

@ karol-majewski Je suis sur TS 3.6.3 et la dernière version @types/react-router: 5.0.4 est en panne, alors que le retour à l'ancienne est OK.

export function withRouter<P extends RouteComponentProps<any>, C extends React.ComponentType<P>>(
  component: C & React.ComponentType<P>,
): React.ComponentClass<Omit<P, keyof RouteComponentProps<any>> & WithRouterProps<C>> & WithRouterStatics<C>;

J'encourage tout le monde à ouvrir de nouveaux numéros. Si nous résolvons votre problème particulier, vous n'avez aucun moyen d'être averti si vous ne commentez que dans un fil de discussion fermé. Le terrain de jeu dactylographié permet désormais de configurer la version ts + config et est capable de télécharger les définitions de type. Inclure un lien dans un nouveau numéro aide beaucoup les responsables. Merci: priez:

Il semble que cela ne lance qu'avec strictFunctionTypes et j'ai une solution en tête. Nous verrons si cela fonctionne.

@sandersn Pouvons-nous rouvrir ceci puisque le correctif a été annulé ?

IIRC, @ eps1lon a découvert que cela était dû à un bogue TypeScript: https://github.com/microsoft/TypeScript/issues/33490

Le correctif arrivera: https://github.com/microsoft/TypeScript/pull/34607.

Fonctionne bien avec la version nocturne. Lien Playground

dactylographié est une perte de temps, j'ai passé des heures à essayer de résoudre cette erreur stupide et rien, donc si le dactylographie est fait pour vous faciliter la vie, il ne fait certainement pas le travail, plein d'erreurs et de bugs

Ce problème a été résolu dans TS 3.7. Fermeture.

Cette page vous a été utile?
0 / 5 - 0 notes