React.memo
de convertir ce qui suit pour utiliser React.memo
:
// Cannot find name 'TRowData'. export const Table = memo<Props<TRowData>>( ~~~~~~~~
Comme ça (incorrect):
interface Props<TRowData> { // props... } export const Table = memo<Props<TRowData>>( ({ propA, propB }) => { })
Comment puis-je corriger cette syntaxe? Actuellement, il a cette erreur:
interface Props<TRowData> { // props... } export function Table<TRowData>({ propA, propB }: Props<TRowData>) { }
4 Réponses :
Vous n'avez pas besoin de passer un composant comme premier paramètre de React.memo
? Je n'ai pas pu le tester, mais j'ai l'impression que c'est le processus de réflexion:
// Overall format: export const Table = memo(MyComponent, MyFunction) // With empty arrow function: export const Table = memo(MyComponent, () => {}) // With your code: export const Table = memo(MyComponent, ({propA, propB}: Props<TRowData>) => { })
Je pense que vous êtes dans la bonne direction, je pense que cela aurait besoin d'être enveloppé dans un style HOC avec cette approche. J'ai réussi à le résoudre avec un casting, mais il existe peut-être une solution plus "correcte"
Je l'ai résolu en le conservant en tant que fonction, en renommant la fonction en TableComponent
et en faisant:
export const Table = memo(TableComponent) as typeof TableComponent
Avec les déclarations de type React actuelles, il n'est pas possible de créer un composant générique à partir de React.memo
. Une solution sans assertions de type consiste à ajouter une surcharge de fonction memo
supplémentaire pour tirer parti de l' inférence de type de fonction d'ordre supérieur TS 3.4:
interface Props<T> { a: T } const TableWrapped = <T extends {}>(props: Props<T>) => <div>{props.a}</div> const Table = memo(TableWrapped) const App = () => ( <> <Table a="foo" /> {/* (props: Props<string>) => ... */} <Table a={3} /> {/* (props: Props<number>) => ... */} </> )
Vous pourrez alors rendre le composant Table
générique. Assurez-vous simplement de passer une fonction générique à memo
:
import React, { memo } from "react" declare module "react" { // augment React types function memo<A, B>(Component: (props: A) => B): (props: A) => ReactElement | null // return type is same as ReturnType<ExoticComponent<any>> }
Simple, passez simplement une fonction non fléchée à React.memo
:
export const Table = React.memo(function<T>(props: Props<T>) { })