Skip to content

Commit a626bb1

Browse files
author
prettifier[bot]
authored
Prettify HOC.md
1 parent da521f9 commit a626bb1

File tree

1 file changed

+6
-9
lines changed

1 file changed

+6
-9
lines changed

HOC.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ export function withTheme<T extends WithThemeProps = WithThemeProps>(
120120
};
121121
}
122122
```
123+
123124
Tenga en cuenta que la aserción `{...this.props as T}` es necesaria debido a un error en TS 3.2 https://github.com/Microsoft/TypeScript/issues/28938#issuecomment-450636046
124125

125126
Para obtener detalles de `Optionalize` consulte la [sección de tipos de utilidad](https://github.com/typescript-cheatsheets/typescript-utilities-cheatsheet#utility-types)
126127

127-
128128
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
@@ -140,8 +140,8 @@ export function inject<TProps, TInjectedKeys extends keyof TProps>(
140140
```
141141

142142
### Usando `forwardRef`
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 básico](https://github.com/typescript-cheatsheets/react-typescript-cheatsheet-es/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.
144143

144+
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 básico](https://github.com/typescript-cheatsheets/react-typescript-cheatsheet-es/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.
145145

146146
# Sección 1: Documentación de React sobre HOC en TypeScript
147147

@@ -313,6 +313,7 @@ function logProps<T>(WrappedComponent: React.ComponentType<T>) {
313313
};
314314
}
315315
```
316+
316317
## Ejemplo de la documentación: [Pasa los _props_ no relacionados al componente envuelto](https://es.reactjs.org/docs/higher-order-components.html#convenci%C3%B3n-pasa-los-props-no-relacionados-al-componente-envuelto)
317318

318319
No se necesitan consejos específicos de Typescript aquí.
@@ -321,7 +322,6 @@ No se necesitan consejos específicos de Typescript aquí.
321322

322323
los HOC pueden tomar la forma de funciones que retornan Componentes de Orden Superior que devuelven Componentes
323324

324-
325325
la función `connect` de `react-redux` tiene una serie de sobrecargas del que puedes obtener inspiración [fuente](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/bc0c933415466b34d2de5790f7cd6418f676801e/types/react-redux/v5/index.d.ts#L77)
326326

327327
Construiremos nuestro propio `connect` para entender los HOC:
@@ -385,7 +385,7 @@ function connect(mapStateToProps: Function, mapDispatchToProps: Function) {
385385
WrappedComponent: React.ComponentType<T>
386386
) {
387387
type Props = JSX.LibraryManagedAttributes<C, Omit<P, "data">>;
388-
// Creando el componente interno. El tipo de propiedades calculadas, es donde ocurre la magia
388+
// Creando el componente interno. El tipo de propiedades calculadas, es donde ocurre la magia
389389
return class ComponentWithTheme extends React.Component<Props> {
390390
public render() {
391391
// Obten los props que desea inyectar. Esto podría hacerse con context
@@ -407,7 +407,6 @@ function connect(mapStateToProps: Function, mapDispatchToProps: Function) {
407407

408408
[Ver en el TypeScript Playground](https://www.typescriptlang.org/play/?jsx=2#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgcilQ3wFgAoCtCAOwGd5qQQkaY64BeOAbQF0A3BSq0GcAMK4WbADLAx3ABQBKLgD44iinDgAeACbAAbnAD0aisuHlq9RlNYwAykgA2SDNC6aA+gC44FBoATwAaOAgAdxoABRwwOgCg4NVODUUAb204YH0AqNj4ugA6XIoAX2UhG1F7ZkcAQQxgUW8VdU0s8h0UfX1JerYAxQYoANHgGgBzVI0maXZisABXOgALTLgYJAAPGHGYKHDcgPnHEvdpmDW4Soqq61sxSRoaD23+hzZvWzeMLW6cDObBc7k8R2ywJgTRgLXolkUAwWcgYD0o5FMpi2ayQdCQgSI2PxYCKWwgcAARvjJgArd5IfSU4JEuAACQA8uIKJNtlBMOh8QB1YDXJzLCl0NBQYBgWG0OIQBK6AAqGi6On0KBgKACyuq5QomGWNGatCBtD+MEUIBQYCc2u2yogCoSAQAYsbTTRwjawAAReRgLVoNZOl2JOAek1ymiqdVwIgwZZQGhwI3RuEq8IxOC7bY0fQcYWi8WS6WyuHhlVqcLiNQAnQ6QVQW1gBkDSBvIaIYgwYod2iOZXBNvV7Jx7I6GAj-Hh7wAKScAA1inIKS2oMEALJBFBTBkNGCHYAU5bbOi6cThdkgEW6GLhABEmu1j7UamqjbMWPERC1kymFlJjeKBzXAQc2GKOBlRxIEUFcNBllcLUGTgOdpzbOAcUJeQWUibD8WufEbSmYA0Cw1tWBKScEyQJMUyBZC6A4AcuxgYtQxxFhcz2VhCx7dA+1Yxx7yKNUaJ0FYKVcMjaILJAoHaeMvx0TFIzokMWRJRUOGCCBljgSIgngWl3igmDcOoJDGSpOB9EHQyRRuWxtj2HI7FQfRigkxsnngX0230e0ULnbhfWCx1nSKRRrnkYoGBQ8JYpKbSEjRFTfNqOAAoZAM6CDGAQ1C7LbTygqQzDaLkvih0kCStY4tSuh0oy79sUa0kmFxQJMF5IyoH4uhySIuDUwgIwFOlfRCNg6b+SQ+BB2owEMsTZNUwbVqdF0ZtKM+cC2J8jKMmKU7qqag0Vq2uATtOnKgtq8NLuuxtbuKe6yuDNYnqOxtzF+lqv2extyk-W59SAA)
409409

410-
411410
## Ejemplo de la documentación: [Envuelve el nombre a mostrar para una depuración fácil](https://es.reactjs.org/docs/higher-order-components.html#convenci%C3%B3n-envuelve-el-nombre-a-mostrar-para-una-depuraci%C3%B3n-f%C3%A1cil)
412411

413412
Este es bastante sencillo
@@ -440,12 +439,10 @@ function getDisplayName<T>(WrappedComponent: React.ComponentType<T>) {
440439
- Los métodos estáticos deben ser copiados
441440
- Las Refs no son pasadas
442441

443-
444442
# sección 2: Excluyendo Props
445443

446444
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.
447445

448-
449446
Digamos que tenemos un componente
450447

451448
```tsx
@@ -501,7 +498,7 @@ Entonces, cómo escribimos `withOwner`?
501498
1. Obtenemos los tipos del componente: `keyof T`
502499
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`
503500
3. (Opcional) Utilice los tipo de intersección sí tiene mas para excluir: `Exclude<keyof T, 'owner' | 'otherprop' | 'moreprop'>`
504-
4. Los nombres de las propiedades no son exactamente iguales a las propiedades en sí, 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 }`
501+
4. Los nombres de las propiedades no son exactamente iguales a las propiedades en sí, 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 }`
505502
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>>`
506503
6. Ahora escribimos el HOC cómo un función genérica:
507504

@@ -521,7 +518,7 @@ _Nota: el de arriba es un ejemplo incompleto y no funcional. PR una solución!_
521518

522519
## Aprende más
523520

524-
Tendremos que extraer las lecciones de aquí en el futuro pero aquí estan:
521+
Tendremos que extraer las lecciones de aquí en el futuro pero aquí estan:
525522

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

0 commit comments

Comments
 (0)