Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

160
Views
Tipo de componente genérico sin estado ¿Reaccionar? O ¿Extender la interfaz de función genérica en mecanografiado para tener un genérico adicional?

Problema : la interfaz del Stateless Functional Component se da como

 interface SFC<P = {}> { (props: P & { children?: ReactNode }, context?: any): ReactElement<any> | null; propTypes?: ValidationMap<P>; }

El tipo de accesorio de mi componente también es genérico como:

 interface Prop<V>{ num: V; }

¿Cómo definir correctamente mi componente? como:

 const myCom: <T>SFC<Prop<T>> = <T>(props: Prop<T>)=> <div>test</div>

da un error en el character 27 que Cannot find name 'T'

Aquí está: Typescript Playground de ejemplo modificado

Mis Hallazgos :

1: Typescript 2.9.1 admite componente genérico con estado: http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-9.html#generic-type-arguments-in-jsx-elements

 class myCom<T> extends React.Component<Prop<T>, any> { render() { return <div>test</div>; } }

2: Extender SFC para crear una nueva interfaz como se menciona en la siguiente respuesta haría que el tipo de accesorio del componente sea any : Typescript React función sin estado con parámetros genéricos/tipos de retorno que no quiero. Quiero dar el tipo adecuado para mi accesorio.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

No puedes usar genéricos como este:

 const myCom: <T>SFC<Prop<T>> = <T>(props: Prop<T>)=> <div>test</div>

La especificación de TypeScript establece:

Una construcción de la forma

 < T > ( ... ) => { ... }

podría analizarse como una expresión de función de flecha con un parámetro de tipo o una aserción de tipo aplicada a una función de flecha sin parámetro de tipo.

fuente; Microsoft/Especificación de TypeScript.md

Su declaración no coincide con el patrón definido en la especificación de TypeScript, por lo tanto, no funcionará.

Sin embargo, no puede usar la interfaz SFC y simplemente declararla usted mismo.

 interface Prop<V> { num: V; } // normal function function Abc<T extends string | number>(props: Prop<T>): React.ReactElement<Prop<T>> { return <div />; } // const lambda function const Abc: <T extends string | number>(p: Prop<T>) => React.ReactElement<Prop<T>> = (props) => { return <div /> }; export default function App() { return ( <React.Fragment> <Abc<number> num={1} /> <Abc<string> num="abc" /> <Abc<string> num={1} /> // string expected but was number </React.Fragment> ); }
over 4 years ago · Santiago Trujillo Report

0

Hay un patrón para mitigar este problema al declarar el alias de tipo de componente genérico fuera del componente y luego simplemente afirmarlo cuando lo necesite.

No tan bonito, pero sigue siendo reutilizable y estricto.

 interface IMyComponentProps<T> { name: string type: T } // instead of inline with component assignment type MyComponentI<T = any> = React.FC<IMyComponentProps<T>> const MyComponent: MyComponentI = props => <p {...props}>Hello</p> const TypedComponent = MyComponent as MyComponentI<number>
over 4 years ago · Santiago Trujillo Report

0

Patrón de fábrica:

 import React, { SFC } from 'react'; export interface GridProps<T = unknown> { data: T[]; renderItem: (props: { item: T }) => React.ReactChild; } export const GridFactory = <T extends any>(): SFC<GridProps<T>> => () => { return ( <div> ... </div> ); }; const Grid = GridFactory<string>();

ACTUALIZACIÓN 03/08/2021

Para evitar errores de reglas de ganchos, debe perfeccionar la sintaxis de esta manera:

 import React, { FC } from 'react'; export interface GridProps<T = unknown> { data: T[] renderItem: (props: { item: T }) => React.ReactChild } export const GridFactory = <T extends any>() => { const Instance: FC<GridProps<T>> = (props) => { const [state, setState] = useState(props.data) return <div>...</div> } return Instance } const Grid = GridFactory<string>()
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!