Skip to content

Commit 031fe0e

Browse files
authored
Merge pull request #13 from bnrosa/add-custom-hooks
Add custom hooks section
2 parents b383372 + 1302f7d commit 031fe0e

File tree

1 file changed

+98
-1
lines changed

1 file changed

+98
-1
lines changed

README.md

+98-1
Original file line numberDiff line numberDiff line change
@@ -537,4 +537,101 @@ function Foo() {
537537
### Veja também (conteúdo em inglês)
538538

539539
- [Issue relacionada por @rajivpunjabi](https://github.com/typescript-cheatsheets/react/issues/388) - [Playground](https://www.typescriptlang.org/play#code/JYWwDg9gTgLgBAKjgQwM5wEoFNkGN4BmUEIcARFDvmQNwCwAUI7hAHarwCCYYcAvHAAUASn4A+OAG9GjOHAD0CBLLnKGcxHABiwKBzgQwMYGxS4WUACbBWAczgwIcSxFwBXEFlYxkxtgDoVTQBJVmBjZAAbOAA3KLcsOAB3YEjogCNE1jc0-zgAGQBPG3tHOAAVQrAsAGVcKGAjOHTCuDdUErhWNgBabLSUVFQsWBNWA2qoX2hA9VU4AGFKXyx0AFk3H3TIxOwCOAB5dIArLHwgpHcoSm84MGJJmFbgdG74ZcsDVkjC2Y01f7yFQsdjvLAEACM-EwVBg-naWD2AB4ABLlNb5GpgZCsACiO083jEgn6kQAhMJ6HMQfpKJCFpE2IkBNg8HCEci0RisTj8VhCTBiaSKVSVIoAaoLnBQuFgFFYvFEikBpkujkMps4FgAB7VfCdLmY7F4gleOFwAByEHg7U63VYfXVg2Go1MhhG0ygf3mAHVUtF6jgYLtwUdTvguta4Bstjs9mGznCpVcbvB7u7YM90B8vj9vYgLkDqWxaeCAEzQ1n4eHDTnoo2801EknqykyObii5SmpnNifA5GMZmCzWOwOJwudwC3xjKUyiLROKRBLJf3NLJO9KanV64xj0koVifQ08k38s1Sv0DJZBxIx5DbRGhk6J5Nua5mu4PEZPOAvSNgsgnxsHmXZzIgRZyDSYIEAAzJWsI1k+BCovWp58gKcAAD5qmkQqtqKHbyCexoYRecw7IQugcAs76ptCdIQv4KZmoRcjyMRaGkU28A4aSKiUXAwwgpYtEfrcAh0mWzF0ax7bsZx3Lceetx8eqAlYPAMAABa6KJskSXAdKwTJ4kwGxCjyKy-bfK05SrDA8mWVagHAbZeScOY0CjqUE6uOgqDaRAOSfKqOYgb8KiMaZ9GSeCEIMkyMVyUwRHWYc7nSvAgUQEk6AjMQXpReWyWGdFLHeBZHEuTCQEZT8xVwaV8BxZCzUWZQMDvuMghBHASJVnCWhTLYApiH1chIqgxpGeCfCSIxAC+Yj3o+8YvvgSLyNNOLjeBGhTTNdLzVJy3reGMBbTtrB7RoB3XbNBAneCsHLatcbPhdV3GrdB1WYhw3IKNZq-W2DCLYRO7QPAljgsgORcDwVJAA)
540-
- [Exemplo de Stefan Baumgartner](https://fettblog.eu/typescript-react/hooks/#useref) - [Playground](https://www.typescriptlang.org/play/?jsx=2#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgIilQ3wFgAoCzAVwDsNgJa4AVJADxgElaxqYA6sBgALAGIQ01AM4AhfjCYAKAJRwA3hThwA9DrjBaw4CgA2waUjgB3YSLi1qp0wBo4AI35wYSZ6wCeYEgAymhQwGDw1lYoRHCmEBAA1oYA5nCY0HAozAASLACyADI8fDAAoqZIIEi0MFpwaEzS8IZllXAAvIjEMAB0MkjImAA8+cWl-JXVtTAAfEqOzioA3A1NtC1wTPIwirQAwuZoSV1wql1zGg3aenAt4RgOTqaNIkgn0g5ISAAmcDJvBA3h9TsBMAZeFNXjl-lIoEQ6nAOBZ+jddPpPPAmGgrPDEfAUS1pG5hAYvhAITBAlZxiUoRUqjU6m5RIDhOi7iIUF9RFYaqIIP9MlJpABCOCAUHJ0eDzm1oXAAGSKyHtUx9fGzNSacjaPWq6Ea6gI2Z9EUyVRrXV6gC+DRtVu0RBgxuYSnRIzm6O06h0ACpIdlfr9jExSQyOkxTP5GjkPFZBv9bKIDYSmbNpH04ABNFD+CV+nR2636kby+BETCddTlyo27w0zr4HycfC6L0lvUjLH7baHY5Jas7BRMI7AE42uYSUXed6pkY6HtMDulnQruCrCg2oA)
540+
- [Exemplo de Stefan Baumgartner](https://fettblog.eu/typescript-react/hooks/#useref) - [Playground](https://www.typescriptlang.org/play/?jsx=2#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgIilQ3wFgAoCzAVwDsNgJa4AVJADxgElaxqYA6sBgALAGIQ01AM4AhfjCYAKAJRwA3hThwA9DrjBaw4CgA2waUjgB3YSLi1qp0wBo4AI35wYSZ6wCeYEgAymhQwGDw1lYoRHCmEBAA1oYA5nCY0HAozAASLACyADI8fDAAoqZIIEi0MFpwaEzS8IZllXAAvIjEMAB0MkjImAA8+cWl-JXVtTAAfEqOzioA3A1NtC1wTPIwirQAwuZoSV1wql1zGg3aenAt4RgOTqaNIkgn0g5ISAAmcDJvBA3h9TsBMAZeFNXjl-lIoEQ6nAOBZ+jddPpPPAmGgrPDEfAUS1pG5hAYvhAITBAlZxiUoRUqjU6m5RIDhOi7iIUF9RFYaqIIP9MlJpABCOCAUHJ0eDzm1oXAAGSKyHtUx9fGzNSacjaPWq6Ea6gI2Z9EUyVRrXV6gC+DRtVu0RBgxuYSnRIzm6O06h0ACpIdlfr9jExSQyOkxTP5GjkPFZBv9bKIDYSmbNpH04ABNFD+CV+nR2636kby+BETCddTlyo27w0zr4HycfC6L0lvUjLH7baHY5Jas7BRMI7AE42uYSUXed6pkY6HtMDulnQruCrCg2oA)
541+
542+
## useImperativeHandle
543+
544+
_Não temos muito ainda sobre esse tema, [há uma discussão nas issues do repositório original](https://github.com/typescript-cheatsheets/react/issues/106). Por favor, contribua se puder!_
545+
546+
```tsx
547+
type ListProps<ItemType> = {
548+
items: ItemType[];
549+
innerRef?: React.Ref<{ scrollToItem(item: ItemType): void }>;
550+
};
551+
552+
function List<ItemType>(props: ListProps<ItemType>) {
553+
useImperativeHandle(props.innerRef, () => ({
554+
scrollToItem() {},
555+
}));
556+
return null;
557+
}
558+
```
559+
560+
## Custom Hooks
561+
562+
Se você estiver retornando um array em seu Custom Hook (hooks customizados), você vai querer evitar a inferência de tipo, pois o TypeScript irá inferir um tipo de união (quando, na verdade, você quer tipos diferentes em cada posição do array). Em vez disso, use [const assertions do TypeScript 3.4](https://devblogs.microsoft.com/typescript/announcing-typescript-3-4/#const-assertions):
563+
564+
```tsx
565+
export function useLoading() {
566+
const [isLoading, setState] = React.useState(false);
567+
const load = (aPromise: Promise<any>) => {
568+
setState(true);
569+
return aPromise.finally(() => setState(false));
570+
};
571+
return [isLoading, load] as const; // infere [boolean, typeof load] ao invés de (boolean | typeof load)[]
572+
}
573+
```
574+
575+
[Veja no TypeScript Playground](https://www.typescriptlang.org/play/?target=5&jsx=2#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgcilQ3wFgAoCpAD0ljkwFcA7DYCZuRgZyQBkIKACbBmAcwAUASjgBvCnDhoO3eAG1g3AcNFiANHF4wAyjBQwkAXTgBeRMRgA6HklPmkEzCgA2vKQG4FJRV4b0EhWzgJFAAFHBBNJAAuODjcRIAeFGYATwA+GRs8uSDFIzcLCRgoRiQA0rgiGEYoTlj4xMdMUR9vHIlpW2Lys0qvXzr68kUAX0DpxqRm1rgNLXDdAzDhaxRuYOZVfzgAehO4UUwkKH21ACMICG9UZgMYHLAkCEw4baFrUSqVARb5RB5PF5wAA+cHen1BfykaksFBmQA)
576+
577+
Dessa forma, quando você desestrutura (desctructure), você obtém os tipos certos com base na posição de desestruturação.
578+
579+
<detalhes>
580+
<summary><b>Alternativa: definir um tipo de retorno de tupla (tuple)</b></summary>
581+
582+
Se você está [tendo problemas com const assertions](https://github.com/babel/babel/issues/9800), você também pode declarar ou definir os tipos do retorno da função:
583+
584+
```tsx
585+
export function useLoading() {
586+
const [isLoading, setState] = React.useState(false);
587+
const load = (aPromise: Promise<any>) => {
588+
setState(true);
589+
return aPromise.finally(() => setState(false));
590+
};
591+
return [isLoading, load] as [
592+
boolean,
593+
(aPromise: Promise<any>) => Promise<any>
594+
];
595+
}
596+
```
597+
598+
Uma função auxiliar que define o tipe de tuplas automaticamente também pode ser útil se você escrever muitos custom hooks:
599+
600+
```tsx
601+
function tuplify<T extends any[]>(...elements: T) {
602+
return elements;
603+
}
604+
605+
function useArray() {
606+
const numberValue = useRef(3).current;
607+
const functionValue = useRef(() => {}).current;
608+
return [numberValue, functionValue]; // o tipo fica (number | (() => void))[]
609+
}
610+
611+
function useTuple() {
612+
const numberValue = useRef(3).current;
613+
const functionValue = useRef(() => {}).current;
614+
return tuplify(numberValue, functionValue); // o tipo fica [number, () => void]
615+
}
616+
```
617+
618+
</details>
619+
620+
Saiba que a equipe do React recomenda que custom hooks que retornam mais de dois valores usem objetos em vez de tuplas.
621+
622+
## Leituras sobre Hooks + TypeScript (em inglês):
623+
624+
- https://medium.com/@jrwebdev/react-hooks-in-typescript-88fce7001d0d
625+
- https://fettblog.eu/typescript-react/hooks/#useref
626+
627+
Se você estiver escrevendo uma biblioteca de Hooks, não esqueça que você também deve expor os tipos para os usuários utilizarem.
628+
629+
## Exemploes de bibliotecas React Hooks + TypeScript:
630+
631+
- https://github.com/mweststrate/use-st8
632+
- https://github.com/palmerhq/the-platform
633+
- https://github.com/sw-yx/hooks
634+
635+
[Tem algo a acrescentar? - link para o repositório original](https://github.com/typescript-cheatsheets/react-typescript-cheatsheet/issues/new).
636+
637+
<!--END-SECTION:hooks-->

0 commit comments

Comments
 (0)