Búsqueda de sitios web

Decorador de componente React en Typescript


Podría ser un error de principiante, pero estoy tratando de crear un decorador de clase simple usando TypeScript para un componente de React, así:

import * as React from 'react'

interface Greeter {
  sayHello: boolean
}

const greet = (arg: Greeter) => (Comp: React.Component) => {
  // do some stuff
}

@greet({ sayHello: true })
class MyComp extends React.Component<any, any> {
  render() {
    return <div>Hi</div>
  }
}

Pero estoy recibiendo un error de compilación que dice

El argumento de tipo 'typeof MyComp' no se puede asignar al parámetro de tipo 'Component<{}, {}>'.

¿Qué exactamente estoy haciendo mal aquí? ¿Me está faltando algo con la sintaxis del decorador?

Respuesta #1

Dado que estás pasando la clase a greet, en lugar de un objeto de esa clase, añade un typeof:

const greet = (arg: Greeter) => (Comp: typeof React.Component) => {
  // do some stuff
}

Respuesta #2

No estoy seguro de cuándo se agregó esto, pero en versiones más recientes de @types/react también puedes hacer React.ComponentType, por ejemplo.

const greet = (arg: Greeter) => (Comp: React.ComponentType) => {
  // do some stuff
}