Definitelytyped: react-router: `withRouter` gagal dengan` ComponentType` dimulai pada 3.6.2

Dibuat pada 10 Sep 2019  ·  10Komentar  ·  Sumber: DefinitelyTyped/DefinitelyTyped

Ini bekerja di 3.5.2, tetapi gagal di 3.6.2.

strict mode dinonaktifkan.

Apakah ini bug dalam pengetikan atau TypeScript?

Saya menambahkan tes yang gagal untuk ini di sini: https://github.com/DefinitelyTyped/DefinitelyTyped/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);

Jika Anda tahu cara memperbaiki masalah tersebut, buat permintaan penarikan sebagai gantinya.

  • [x] Saya mencoba menggunakan paket @types/xxxx dan mengalami masalah.
  • [x] Saya mencoba menggunakan versi stabil terbaru dari tsc. https://www.npmjs.com/package/typescript
  • [x] Saya punya pertanyaan yang tidak pantas untuk StackOverflow . (Silakan ajukan pertanyaan yang sesuai di sana).
  • [x] [Sebutkan] (https://github.com/blog/821-mention-somebody-they-re-notified) penulis (lihat Definitions by: dalam index.d.ts ) sehingga mereka bisa menanggapi.

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

Jika Anda tidak menyebutkan penulisnya, masalah ini akan diabaikan.

Bug

Komentar yang paling membantu

Saya masih mengalami masalah bahkan setelah perbaikan ini. Pesan kesalahan adalah sesuatu seperti

 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; }'.

dengan komponen yang didefinisikan sebagai

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

interface Props extends RouteComponentProps {
  myProp: boolean;
}

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

export default withRouter(Component);

saya menggunakan

typescript: 3.6.3
@types/react-router: 5.0.4

Semua 10 komentar

Saya tidak akan punya waktu untuk menggali lebih dalam. Saya pikir kita hanya harus menghapus penggunaan ComponentType dan menggunakan fungsi biasa dengan props eksplisit yang berkaitan dengan ref dan children . ComponentType selalu sedikit bermasalah karena penyatuan. Jika tidak membuat kesalahan, itu menghasilkan persatuan yang sangat besar dengan hocs lainnya. Konsumen perpustakaan seharusnya tidak menyentuh statika, jadi kehilangan itu seharusnya tidak menjadi masalah.

Punya masalah yang sama. Sudah dilaporkan di repo react-router (https://github.com/ReactTraining/react-router/issues/6906) tetapi dialihkan ke sini.

Saya masih mengalami masalah bahkan setelah perbaikan ini. Pesan kesalahan adalah sesuatu seperti

 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; }'.

dengan komponen yang didefinisikan sebagai

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

interface Props extends RouteComponentProps {
  myProp: boolean;
}

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

export default withRouter(Component);

saya menggunakan

typescript: 3.6.3
@types/react-router: 5.0.4

@ karol-majewski Saya menggunakan TS 3.6.3 dan versi terbaru @types/react-router: 5.0.4 rusak, sementara kembali ke versi sebelumnya tidak masalah.

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>;

Saya mendorong semua orang untuk membuka masalah baru. Jika kami memperbaiki masalah khusus Anda, Anda tidak akan diberi tahu jika Anda hanya berkomentar di utas tertutup. Taman bermain ketikan sekarang memungkinkan konfigurasi ts version + config dan dapat mengunduh definisi jenis. Menyertakan tautan dalam masalah baru sangat membantu pengelola. Terima kasih: berdoa:

Sepertinya ini hanya melempar dengan strictFunctionTypes dan saya punya solusi dalam pikiran. Kami akan melihat apakah itu berhasil.

@sandersn Bisakah kita membuka kembali ini karena perbaikan dikembalikan ?

IIRC, @ eps1lon menemukan bahwa ini disebabkan oleh bug TypeScript: https://github.com/microsoft/TypeScript/issues/33490

Perbaikan akan masuk: https://github.com/microsoft/TypeScript/pull/34607.

Bekerja dengan baik dengan versi malam. Tautan Playground

typescript adalah buang-buang waktu, saya telah menghabiskan waktu berjam-jam mencoba menyelesaikan kesalahan dan kesalahan bodoh ini, jadi jika skrip dibuat untuk membuat hidup lebih mudah sudah pasti tidak melakukan pekerjaan, penuh kesalahan dan bug

Masalah ini telah diperbaiki di TS 3.7. Penutupan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat