Skip to content

Commit 666a31b

Browse files
hansgarciahansgarcia
hansgarcia
authored and
hansgarcia
committed
feat: syntax review
1 parent 2c27a2d commit 666a31b

File tree

1 file changed

+50
-50
lines changed

1 file changed

+50
-50
lines changed

Diff for: HOC.md

+50-50
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
**Este HOC Cheatsheet** agrupa todo el conocimiento disponible para escribir Componentes de Orden Superior (HOC por las siglas en inglés de higher-order component) con React y Typescript.
3030

3131
- Inicialmente haremos un mapa detallado de la [documentación oficial sobre HOC](https://reactjs.org/docs/higher-order-components.html).
32-
- Si bien existen hooks, muchas librerias y bases de código aún necesitan escribir HOC
32+
- Si bien existen hooks, muchas librerías y bases de código aún necesitan escribir HOC
3333
- Render props podrian ser considerado en el futuro
3434
- El objetivo es escribir HOC que ofrezcan un tipado seguro sin interferir
3535

@@ -51,7 +51,7 @@
5151

5252
> Este es un ejemplo de un HOC para copiar y pegar. Si ciertos pedazos no tienen sentido para ti, ve a la [Sección 1](#section-1-react-hoc-docs-in-typescript) para obtener un tutorial detallado a través de una traducción completa de la documentación de React en Typescript.
5353
54-
A veces quieres una forma sencilla de pasar props desde otro lugar (ya sea el store global o un provider) y no quieres continuamente pasar los props hacia abajo. Context es excelente para eso, pero entonces los valores desde el context solo pueden ser usado desde tu función `render`. Un HOC proveerá esos valores como props.
54+
A veces quieres una forma sencilla de pasar props desde otro lugar (ya sea el store global o un provider) y no quieres continuamente pasar los props hacia abajo. Context es excelente para eso, pero entonces los valores desde el context solo pueden ser usado desde tu función `render`. Un HOC proveerá esos valores cómo props.
5555

5656
**Los props inyectados**
5757

@@ -76,7 +76,7 @@ class MyButton extends React.Component<Props> {
7676
}
7777

7878
private someInternalMethod() {
79-
// Los valores del tema tambien estan aqui disponibles como props.
79+
// Los valores del tema también estan aquí disponibles cómo props.
8080
}
8181
}
8282

@@ -88,8 +88,8 @@ export default withTheme(MyButton);
8888
Ahora, al consumir el componente puedes omitir el prop `primaryColor` o anular el que fue proporcionado a través del context.
8989

9090
```tsx
91-
<MyButton>Hello button</MyButton> // Valido
92-
<MyButton primaryColor="#333">Hello Button</MyButton> // Tambien valido
91+
<MyButton>Hello button</MyButton> // Válido
92+
<MyButton primaryColor="#333">Hello Button</MyButton> // Tambien válido
9393
```
9494

9595
**Declarando el HoC**
@@ -104,17 +104,17 @@ export function withTheme<T extends WithThemeProps = WithThemeProps>(
104104
const displayName =
105105
WrappedComponent.displayName || WrappedComponent.name || "Component";
106106

107-
// Creando el component interno. El tipo de prop calculado aqui es donde ocurre la magia.
107+
// Creando el componente interno. El tipo de prop calculado aquí es donde ocurre la magia.
108108
return class ComponentWithTheme extends React.Component<
109109
Optionalize<T, WithThemeProps>
110110
> {
111111
public static displayName = `withPages(${displayName})`;
112112

113113
public render() {
114-
// Obten los props que quiere inyectar. Esto podria ser hecho con context.
114+
// Obten los props que quiere inyectar. Esto podría ser hecho con context.
115115
const themeProps = getThemePropsFromSomeWhere();
116116

117-
// this.props viene despues para que puedan anular los props predeterminados.
117+
// this.props viene después para que puedan anular los props predeterminados.
118118
return <WrappedComponent {...themeProps} {...(this.props as T)} />;
119119
}
120120
};
@@ -125,10 +125,10 @@ Tenga en cuenta que la aserción `{...this.props as T}` es necesaria debido a un
125125
Para obtener detalles de `Optionalize` consulte la [sección de tipos de utilidad](https://github.com/typescript-cheatsheets/typescript-utilities-cheatsheet#utility-types)
126126

127127

128-
Aquí hay un ejemplo más avanzado de un Componente Dinámico de Orden Superior (HOC por las siglas en inglés de higher-order component) que basa algunos de sus parametros en los props del componente que está siendo pasado.
128+
Aquí hay un ejemplo más avanzado de un Componente Dinámico de Orden Superior (HOC por las siglas en inglés de higher-order component) que basa algunos de sus parámetros en los props del componente que está siendo pasado.
129129

130130
```tsx
131-
// Inyecta valores estaticos a un componente de tal manera que siempre son proporcionados.
131+
// Inyecta valores estáticos a un componente de tal manera que siempre son proporcionados.
132132
export function inject<TProps, TInjectedKeys extends keyof TProps>(
133133
Component: React.JSXElementConstructor<TProps>,
134134
injector: Pick<TProps, TInjectedKeys>
@@ -140,16 +140,16 @@ export function inject<TProps, TInjectedKeys extends keyof TProps>(
140140
```
141141

142142
### Usando `forwardRef`
143-
Para una reutilización "verdadera", tambien debes considerar exponer una referencia para tus HOC. Puedes utilizar `React.forwardRef<Ref, Props>` como está documentado en [el cheatsheet basico](https://github.com/typescript-cheatsheets/react-typescript-cheatsheet/blob/master/README.md#forwardrefcreateref), pero estamos interesados en más ejemplos del mundo real. [Aquí hay un buen ejemplo en práctica](https://gist.github.com/OliverJAsh/d2f462b03b3e6c24f5588ca7915d010e) de @OliverJAsh.
143+
Para una reutilización "verdadera", también debes considerar exponer una referencia para tus HOC. Puedes utilizar `React.forwardRef<Ref, Props>` cómo está documentado en [el cheatsheet basico](https://github.com/typescript-cheatsheets/react-typescript-cheatsheet/blob/master/README.md#forwardrefcreateref), pero estamos interesados en más ejemplos del mundo real. [Aquí hay un buen ejemplo en práctica](https://gist.github.com/OliverJAsh/d2f462b03b3e6c24f5588ca7915d010e) de @OliverJAsh.
144144

145145

146-
# Seccion 1: Documentacion de React sobre HOC en TypeScript
146+
# Sección 1: Documentación de React sobre HOC en TypeScript
147147

148-
En esta primera seccion nos referimos de cerca a [la documentacion de React sobre HOC](https://reactjs.org/docs/higher-order-components.html) y ofrecemos un paralelo directo en TypeScript.
148+
En esta primera sección nos referimos de cerca a [la documentación de React sobre HOC](https://reactjs.org/docs/higher-order-components.html) y ofrecemos un paralelo directo en TypeScript.
149149

150150
#
151151

152-
## Ejemplo de la documentacion: [Usa HOCs para preocupaciones transversales](https://reactjs.org/docs/higher-order-components.html#use-hocs-for-cross-cutting-concerns)
152+
## Ejemplo de la documentación: [Usa HOCs para preocupaciones transversales](https://reactjs.org/docs/higher-order-components.html#use-hocs-for-cross-cutting-concerns)
153153

154154
<details>
155155

@@ -176,7 +176,7 @@ const comments: CommentType[] = [
176176
];
177177
const blog = "blogpost";
178178

179-
/** simulacion de la data */
179+
/** simulación de la data */
180180
const DataSource = {
181181
addChangeListener(e: Function) {
182182
// Hace algo
@@ -199,7 +199,7 @@ type DataType = typeof DataSource;
199199
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
200200
// type Optionalize<T extends K, K> = Omit<T, keyof K>;
201201

202-
/** Componentes reescritos de la documentacion de React que solo utilizan datos props inyectados */
202+
/** Componentes reescritos de la documentación de React que solo utilizan datos props inyectados */
203203
function CommentList({ data }: WithDataProps<typeof comments>) {
204204
return (
205205
<div>
@@ -226,21 +226,21 @@ function BlogPost({ data, id }: BlogPostProps) {
226226

227227
</details>
228228

229-
Ejemplo de un HOC de la documentacion de React traducido a TypeScript
229+
Ejemplo de un HOC de la documentación de React traducido a TypeScript
230230

231231
```tsx
232-
// Estos son los props que seran inyectados por el HOC
232+
// Estos son los props que serán inyectados por el HOC
233233
interface WithDataProps<T> {
234-
data: T; // data es generico
234+
data: T; // data es genérico
235235
}
236236
// T es el tipo de data
237237
// P son los props del componente envuelto que es inferido
238-
// C es la interfaz real del component envuelto (utilizado para tomar los defaultProps)
238+
// C es la interfaz real del componente envuelto (utilizado para tomar los defaultProps)
239239
export function withSubscription<T, P extends WithDataProps<T>, C>(
240-
// this type allows us to infer P, but grab the type of WrappedComponent separately without it interfering with the inference of P
240+
// este tipo nos permite inferir P, pero toma el tipo de componente envuelto por separado sin que interfiera con la inferencia en P
241241
WrappedComponent: React.JSXElementConstructor<P> & C,
242-
// selectData is a functor for T
243-
// props is Readonly because it's readonly inside of the class
242+
// selectData es un functor para T
243+
// los props son solo de lectura porque son solo lectura dentro de la clase
244244
selectData: (
245245
dataSource: typeof DataSource,
246246
props: Readonly<JSX.LibraryManagedAttributes<C, Omit<P, "data">>>
@@ -272,8 +272,8 @@ export function withSubscription<T, P extends WithDataProps<T>, C>(
272272
});
273273

274274
render() {
275-
// the typing for spreading this.props is... very complex. best way right now is to just type it as any
276-
// data will still be typechecked
275+
// la escritura para difundir this.props es... muy compleja. La mejor manera de hacerlo ahora mismo es escribirlo cómo `any`
276+
// data todavia sera verificada
277277
return (
278278
<WrappedComponent data={this.state.data} {...(this.props as any)} />
279279
);
@@ -282,7 +282,7 @@ export function withSubscription<T, P extends WithDataProps<T>, C>(
282282
// return WithData;
283283
}
284284

285-
/** HOC usage with Components */
285+
/** Uso de HOC con Componentes */
286286
export const CommentListWithSubscription = withSubscription(
287287
CommentList,
288288
(DataSource: DataType) => DataSource.getComments()
@@ -295,9 +295,9 @@ export const BlogPostWithSubscription = withSubscription(
295295
);
296296
```
297297

298-
## Docs Example: [Don’t Mutate the Original Component. Use Composition.](https://reactjs.org/docs/higher-order-components.html#dont-mutate-the-original-component-use-composition)
298+
## Ejemplo de documentación: [No mutes el componente original. Usa composición.](https://es.reactjs.org/docs/higher-order-components.html#no-mutes-el-componente-original-usa-composici%C3%B3n)
299299

300-
This is pretty straightforward - make sure to assert the passed props as `T` [due to the TS 3.2 bug](https://github.com/Microsoft/TypeScript/issues/28938#issuecomment-450636046).
300+
Es bastante sencillo - asegurate de comprobar los props recibidos cómo `T` [debido al error TS 3.2](https://github.com/Microsoft/TypeScript/issues/28938#issuecomment-450636046).
301301

302302
```tsx
303303
function logProps<T>(WrappedComponent: React.ComponentType<T>) {
@@ -309,22 +309,22 @@ function logProps<T>(WrappedComponent: React.ComponentType<T>) {
309309
console.log("Next props: ", nextProps);
310310
}
311311
render() {
312-
// Wraps the input component in a container, without mutating it. Good!
312+
// Envuelve el componente de entrada en un contenedor sin mutarlo. Muy bien!
313313
return <WrappedComponent {...(this.props as T)} />;
314314
}
315315
};
316316
}
317317
```
318-
## Ejemplo de documentacion: [Pasa los props no relacionados al componente envuelto][Pass Unrelated Props Through to the Wrapped Component](https://es.reactjs.org/docs/higher-order-components.html#convention-pass-unrelated-props-through-to-the-wrapped-component)
318+
## Ejemplo de documentación: [Pasa los props no relacionados al componente envuelto](https://es.reactjs.org/docs/higher-order-components.html#convention-pass-unrelated-props-through-to-the-wrapped-component)
319319

320-
No se necesitan consejos especificos de Typescript aqui.
320+
No se necesitan consejos específicos de Typescript aquí.
321321

322-
## Ejemplo de documentacion: [Maximizar la componibilidad](https://es.reactjs.org/docs/higher-order-components.html#convention-maximizing-composability)
322+
## Ejemplo de documentación: [Maximizar la componibilidad](https://es.reactjs.org/docs/higher-order-components.html#convention-maximizing-composability)
323323

324-
los HOC pueden tomar la forma de functiones que retornan Componentes de Orden Superior que devuelven Componentes
324+
los HOC pueden tomar la forma de funciones que retornan Componentes de Orden Superior que devuelven Componentes
325325

326326

327-
la funcion `connect` de `react-redux` tiene una serie de sobrecargas del que puedes obtener inspiracion []
327+
la función `connect` de `react-redux` tiene una serie de sobrecargas del que puedes obtener inspiración []
328328
`connect` from `react-redux` has a number of overloads you can take inspiration [fuente](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/bc0c933415466b34d2de5790f7cd6418f676801e/types/react-redux/v5/index.d.ts#L77).
329329

330330
Construiremos nuestro propio `connect` para entender los HOC:
@@ -353,7 +353,7 @@ const comments: CommentType[] = [
353353
];
354354
/** componentes ficticios que reciben cualquier cosa */
355355
const Comment = (_: any) => null;
356-
/** Componentes reescritos de la documentacion de React que solo utilizan props de datos inyectados **/
356+
/** Componentes reescritos de la documentación de React que solo utilizan props de datos inyectados **/
357357
function CommentList({ data }: WithSubscriptionProps<typeof comments>) {
358358
return (
359359
<div>
@@ -391,10 +391,10 @@ function connect(mapStateToProps: Function, mapDispatchToProps: Function) {
391391
// Creando el componente interno. El tipo de propiedades calculadas, es donde ocurre la magia
392392
return class ComponentWithTheme extends React.Component<Props> {
393393
public render() {
394-
// Obten los props que desea inyectar. Esto podria hacerse con context
394+
// Obten los props que desea inyectar. Esto podría hacerse con context
395395
const mappedStateProps = mapStateToProps(this.state, this.props);
396396
const mappedDispatchProps = mapDispatchToProps(this.state, this.props);
397-
// this props viene despues de tal modo que anula los predeterminados
397+
// this props viene después de tal modo que anula los predeterminados
398398
return (
399399
<WrappedComponent
400400
{...this.props}
@@ -411,7 +411,7 @@ function connect(mapStateToProps: Function, mapDispatchToProps: Function) {
411411
[Ver en el TypeScript Playground](https://www.typescriptlang.org/play/?jsx=2#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgcilQ3wFgAoCtCAOwGd5qQQkaY64BeOAbQF0A3BSq0GcAMK4WbADLAx3ABQBKLgD44iinDgAeACbAAbnAD0aisuHlq9RlNYwAykgA2SDNC6aA+gC44FBoATwAaOAgAdxoABRwwOgCg4NVODUUAb204YH0AqNj4ugA6XIoAX2UhG1F7ZkcAQQxgUW8VdU0s8h0UfX1JerYAxQYoANHgGgBzVI0maXZisABXOgALTLgYJAAPGHGYKHDcgPnHEvdpmDW4Soqq61sxSRoaD23+hzZvWzeMLW6cDObBc7k8R2ywJgTRgLXolkUAwWcgYD0o5FMpi2ayQdCQgSI2PxYCKWwgcAARvjJgArd5IfSU4JEuAACQA8uIKJNtlBMOh8QB1YDXJzLCl0NBQYBgWG0OIQBK6AAqGi6On0KBgKACyuq5QomGWNGatCBtD+MEUIBQYCc2u2yogCoSAQAYsbTTRwjawAAReRgLVoNZOl2JOAek1ymiqdVwIgwZZQGhwI3RuEq8IxOC7bY0fQcYWi8WS6WyuHhlVqcLiNQAnQ6QVQW1gBkDSBvIaIYgwYod2iOZXBNvV7Jx7I6GAj-Hh7wAKScAA1inIKS2oMEALJBFBTBkNGCHYAU5bbOi6cThdkgEW6GLhABEmu1j7UamqjbMWPERC1kymFlJjeKBzXAQc2GKOBlRxIEUFcNBllcLUGTgOdpzbOAcUJeQWUibD8WufEbSmYA0Cw1tWBKScEyQJMUyBZC6A4AcuxgYtQxxFhcz2VhCx7dA+1Yxx7yKNUaJ0FYKVcMjaILJAoHaeMvx0TFIzokMWRJRUOGCCBljgSIgngWl3igmDcOoJDGSpOB9EHQyRRuWxtj2HI7FQfRigkxsnngX0230e0ULnbhfWCx1nSKRRrnkYoGBQ8JYpKbSEjRFTfNqOAAoZAM6CDGAQ1C7LbTygqQzDaLkvih0kCStY4tSuh0oy79sUa0kmFxQJMF5IyoH4uhySIuDUwgIwFOlfRCNg6b+SQ+BB2owEMsTZNUwbVqdF0ZtKM+cC2J8jKMmKU7qqag0Vq2uATtOnKgtq8NLuuxtbuKe6yuDNYnqOxtzF+lqv2extyk-W59SAA)
412412

413413

414-
## Ejemplo de documentacion: [Envuelve el nombre a mostrar para una depuración fácil](https://es.reactjs.org/docs/higher-order-components.html#convention-wrap-the-display-name-for-easy-debugging)
414+
## Ejemplo de documentación: [Envuelve el nombre a mostrar para una depuración fácil](https://es.reactjs.org/docs/higher-order-components.html#convention-wrap-the-display-name-for-easy-debugging)
415415

416416
Este es bastante sencillo
417417

@@ -437,16 +437,16 @@ function getDisplayName<T>(WrappedComponent: React.ComponentType<T>) {
437437
}
438438
```
439439

440-
## No escrito: [seccion de consideraciones](https://es.reactjs.org/docs/higher-order-components.html#consideraciones)
440+
## No escrito: [sección de consideraciones](https://es.reactjs.org/docs/higher-order-components.html#consideraciones)
441441

442-
- No utilice HOCs dentro del metodo render
443-
- Los metodos estaticos deben ser copiados
442+
- No utilice HOCs dentro del método render
443+
- Los métodos estáticos deben ser copiados
444444
- Las Refs no son pasadas
445445

446446

447-
# Seccion 2: Excluyendo Props
447+
# sección 2: Excluyendo Props
448448

449-
Esto es cubierto en la seccion 1 pero aqui nos centraremos en el ya que es un problema muy comun. Los HOC a menudo inyectan props a componentes pre-fabricados. El problema que queremos resolver es que el component envuelto en HOC exponga un tipo que refleje el area de superficie reducida de los props - sin tener que volver a escribir manualmente el HOC cada vez. Esto implica algunos genericos, afortunadamente con algunas utilidades auxiliares.
449+
Esto es cubierto en la sección 1 pero aquí nos centraremos en el ya que es un problema muy común. Los HOC a menudo inyectan props a componentes pre-fabricados. El problema que queremos resolver es que el componente envuelto en HOC exponga un tipo que refleje el área de superficie reducida de los props - sin tener que volver a escribir manualmente el HOC cada vez. Esto implica algunos genericos, afortunadamente con algunas utilidades auxiliares.
450450

451451

452452
Digamos que tenemos un componente
@@ -468,7 +468,7 @@ And we have a `withOwner` HOC that injects the `owner`:
468468
const OwnedDog = withOwner("swyx")(Dog);
469469
```
470470

471-
Queremos escribir `withOwner` de tal modo que pase por los tipos de cualquier component como `Dog`, en el tipo de `OwnedDog`, menos la propiedad `owner` que inyecta:
471+
Queremos escribir `withOwner` de tal modo que pase por los tipos de cualquier componente cómo `Dog`, en el tipo de `OwnedDog`, menos la propiedad `owner` que inyecta:
472472

473473
```tsx
474474
typeof OwnedDog; // queremos que sea igual a { name: string }
@@ -499,14 +499,14 @@ const OwnedCat = withOwner("swyx")(Cat);
499499
<OwnedCat lives={9} />; // este debe estar bien
500500
```
501501

502-
Entonces, como escribirmos `withOwner`?
502+
Entonces, cómo escribimos `withOwner`?
503503

504504
1. Obtenemos los tipos del componente: `keyof T`
505505
2. Nosotros `Exclude` las propiedades que queremos encamascarar: `Exclude<keyof T, 'owner'>`, esto te deje con una lista de nombre de propiedades que quieres en el componente envuelto ejm: `name`
506-
3. (Opcional) Utilice los tipo de interseccion si tiene mas para excluir: `Exclude<keyof T, 'owner' | 'otherprop' | 'moreprop'>`
507-
4. Los nombres de las propiedades no son exactamente iguales a las propiedades en si, los cuales tambien tienen un tipo asociado. Asi que utilizamos esta lista generada de nombre para elegir `Pick` de los props originales: `Pick<keyof T, Exclude<keyof T, 'owner'>>`, this leaves you with the new, filtered props, e.g. `{ name: string }`
506+
3. (Opcional) Utilice los tipo de intersección sí tiene mas para excluir: `Exclude<keyof T, 'owner' | 'otherprop' | 'moreprop'>`
507+
4. Los nombres de las propiedades no son exactamente iguales a las propiedades en , los cuales también tienen un tipo asociado. Así que utilizamos esta lista generada de nombre para elegir `Pick` de los props originales: `Pick<keyof T, Exclude<keyof T, 'owner'>>`, this leaves you with the new, filtered props, e.g. `{ name: string }`
508508
5. (opcional) En lugar de escribir esto manualmente cada vez, podemos utilizar esta utilidad: `type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>`
509-
6. Ahora escribimos el HOC como un funcion generica:
509+
6. Ahora escribimos el HOC cómo un función genérica:
510510

511511
```tsx
512512
function withOwner(owner: string) {
@@ -520,11 +520,11 @@ function withOwner(owner: string) {
520520
}
521521
```
522522

523-
_Nota: el de arriba es un ejemplo incompleto y no funcional. PR una solucion!_
523+
_Nota: el de arriba es un ejemplo incompleto y no funcional. PR una solución!_
524524

525525
## Aprende más
526526

527-
Tendremos que extraer las lecciones de aqui en el futuro pero aqui estan:
527+
Tendremos que extraer las lecciones de aquí en el futuro pero aquí estan:
528528

529529
- https://medium.com/@xfor/typescript-react-hocs-context-api-cb46da611f12
530530
- https://medium.com/@jrwebdev/react-higher-order-component-patterns-in-typescript-42278f7590fb

0 commit comments

Comments
 (0)