Skip to content

Commit a41f0bf

Browse files
docs(vue-query): update typescript page examples and playgrounds, add link to custom-client page (#5890)
* docs(vue-query): update typescript page examples and playgrounds * docs(vue-query): add link to custom-client page
1 parent 849967e commit a41f0bf

File tree

3 files changed

+79
-37
lines changed

3 files changed

+79
-37
lines changed

docs/config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,8 +579,8 @@
579579
"to": "vue/guides/custom-logger"
580580
},
581581
{
582-
"label": "Testing",
583-
"to": "vue/guides/testing"
582+
"label": "Custom Client",
583+
"to": "vue/guides/custom-client"
584584
},
585585
{
586586
"label": "Does this replace [Vuex, Pinia]?",

docs/react/typescript.md

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ Things to keep in mind:
1616

1717
Types in React Query generally flow through very well so that you don't have to provide type annotations for yourself
1818

19+
[//]: # 'TypeInference1'
20+
1921
```tsx
2022
const { data } = useQuery({
2123
// ^? const data: number | undefined
@@ -24,11 +26,10 @@ const { data } = useQuery({
2426
})
2527
```
2628

27-
[//]: # 'Playground1'
28-
2929
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAORToCGAxjALQCOO+VAsAFC8MQAdqnhIAJnRh0icALwoM2XHgAUAbSqDkIAEa4qAXQA0cFQEo5APjgAFciGAYAdLVQQANgDd0KgKxmzXgB6ILgw8IA9AH5eIA)
3030

31-
[//]: # 'Playground1'
31+
[//]: # 'TypeInference1'
32+
[//]: # 'TypeInference2'
3233

3334
```tsx
3435
const { data } = useQuery({
@@ -39,14 +40,14 @@ const { data } = useQuery({
3940
})
4041
```
4142

42-
[//]: # 'Playground2'
43-
4443
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAORToCGAxjALQCOO+VAsAFC8MQAdqnhIAJnRh0icALwoM2XHgAUAbSox0IqgF0ANHBUBKOQD44ABXIhgGAHS1UEADYA3dCoCsxw0gwu6EwAXHASUuZhknT2MBAAyjBQwIIA5iaExrwA9Nlw+QUAegD8vEA)
4544

46-
[//]: # 'Playground2'
45+
[//]: # 'TypeInference2'
4746

4847
This works best if your `queryFn` has a well-defined returned type. Keep in mind that most data fetching libraries return `any` per default, so make sure to extract it to a properly typed function:
4948

49+
[//]: # 'TypeInference3'
50+
5051
```tsx
5152
const fetchGroups = (): Promise<Group[]> =>
5253
axios.get('/groups').then((response) => response.data)
@@ -55,16 +56,16 @@ const { data } = useQuery({ queryKey: ['groups'], queryFn: fetchGroups })
5556
// ^? const data: Group[] | undefined
5657
```
5758

58-
[//]: # 'Playground3'
59-
6059
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAORToCGAxjALQCOO+VAsAFCiSw4dAB7AIqUuUpURY1Nx68YeMOjgBxcsjBwAvIjjAAJgC44AO2QgARriK9eDCOdTwS6GAwAWmiNon6ABQAlGYAClLAGAA8vtoA2gC6AHx6qbLiAHQA5h6BVAD02Vpg8sGZMF7o5oG0qJAuarqpdQ0YmUZ0MHTBDjxOLvBInd1EeigY2Lh4gfFUxX6lVIkANKQe3nGlvTwFBXAHhwB6APxwA65wI3RmW0lwAD4o5kboJMDm6Ea8QA)
6160

62-
[//]: # 'Playground3'
61+
[//]: # 'TypeInference3'
6362

6463
## Type Narrowing
6564

6665
React Query uses a [discriminated union type](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes-func.html#discriminated-unions) for the query result, discriminated by the `status` field and the derived status boolean flags. This will allow you to check for e.g. `success` status to make `data` defined:
6766

67+
[//]: # 'TypeNarrowing'
68+
6869
```tsx
6970
const { data, isSuccess } = useQuery({
7071
queryKey: ['test'],
@@ -77,16 +78,16 @@ if (isSuccess) {
7778
}
7879
```
7980

80-
[//]: # 'Playground4'
81-
8281
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAORToCGAxjALQCOO+VAsAFC8MQAdqnhIAJnRh0ANHGCoAysgYN0qVETgBeFBmy48ACgDaVGGphUAurMMBKbQD44ABXIh56AHS1UEADYAbuiGAKx2dry8wCRwhvJKKmqoDgi8cBlwElK8APS5GQB6APy8hLxAA)
8382

84-
[//]: # 'Playground4'
83+
[//]: # 'TypeNarrowing'
8584

8685
## Typing the error field
8786

8887
The type for error defaults to `unknown`. This is in line with what TypeScript gives you per default in a catch clauses (see [useUnknownInCatchVariables](https://devblogs.microsoft.com/typescript/announcing-typescript-4-4/#use-unknown-catch-variables)). The safest way to work with `error` would be to perform a runtime check; another way would be to explicitly define types for `data` and `error`:
8988

89+
[//]: # 'TypingError'
90+
9091
```tsx
9192
const { error } = useQuery({ queryKey: ['groups'], queryFn: fetchGroups })
9293
// ^? const error: unknown
@@ -97,22 +98,19 @@ if (error instanceof Error) {
9798
}
9899
```
99100

100-
[//]: # 'Playground5'
101-
102101
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAORToCGAxjALQCOO+VAsAFCiSw4dAB7AIqUuUpURY1Nx68YeMOjgBxcsjBwAvIjjAAJgC44AO2QgARriK9eDCOdTwS6GAwAWmiNon6ABQAlGYAClLAGAA8vtoA2gC6AHx6qbLiAHQA5h6BVAD02Vpg8sGZMF7o5oG0qJAuarqpdQ0YmUZ0MHTBDjxOLvBIuORQRHooGNi4eIHxVMV+pVSJADSkHt5xpb08BQVwh0cAegD8fcAkcIEj0IaDdOYM6BBXAKJQo8GIvIe3ULx9nAzrxCEA)
103102

104-
[//]: # 'Playground5'
103+
[//]: # 'TypingError'
104+
[//]: # 'TypingError2'
105105

106106
```tsx
107107
const { error } = useQuery<Group[], Error>(['groups'], fetchGroups)
108108
// ^? const error: Error | null
109109
```
110110

111-
[//]: # 'Playground6'
112-
113111
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAORToCGAxjALQCOO+VAsAFCiSw4dAB7AIqUuUpURY1Nx68YeMOjgBxcsjBwAvIjjAAJgC44AO2QgARriK9eDCOdTwS6GAwAWmiNon6ABQAlGYAClLAGAA8vtoA2gC6AHx6qbLiAHQA5h6BVAD02Vpg8sGZMF7o5oG0qJAuarqpdQ0YmUZ0MHTBDjxOLvBIuORQRHooGNi4eLElSQA0cACiUKPJgfFUxX6lVIlL7p4+Jai9PAUFcNc3AHoA-LxAA)
114112

115-
[//]: # 'Playground6'
113+
[//]: # 'TypingError2'
116114
[//]: # 'Materials'
117115

118116
## Further Reading

docs/vue/typescript.md

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,79 @@ replace:
66
{ 'React': 'Vue', 'react-query package version': 'vue-query package version' }
77
---
88

9-
[//]: # 'Playground1'
9+
[//]: # 'TypeInference1'
1010

11-
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUBNYRm8JABN6DInAC8KDNlx4AFAG0qjZCABGuKgF0ANHB0BKNQD44ABXIhgGAHRR0qCAA23Og6AKx2dhKcnHCxcQB6APwSQA)
11+
```tsx
12+
const { data } = useQuery({
13+
// ^? const data: Ref<number> | Ref<undefined>
14+
queryKey: ['test'],
15+
queryFn: () => Promise.resolve(5),
16+
})
17+
```
1218

13-
[//]: # 'Playground1'
14-
[//]: # 'Playground2'
19+
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUBNYRm8JABN6DInAC8KDNlx4AFAglw4nTocMA9APwG4Q7QGl0eAFxwA2lRjoWVALoAaa1t8ADFGFx0ASjUAPjgABXIQYAwAOigvCAAbbnQdAFYIgPFCCKA)
1520

16-
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUBNYRm8JABN6DInAC8KDNlx4AFAG0qMdCyoBdADRwdASjUA+OAAVyIYBgB0UYxAA23dDoArNaWSBg+6KwwAFxwisqqDvH07jAQAMowUMCMAOY2hNYSnJxwZeUAegD8EkA)
21+
[//]: # 'TypeInference1'
22+
[//]: # 'TypeInference2'
1723

18-
[//]: # 'Playground2'
19-
[//]: # 'Playground3'
24+
```tsx
25+
const { data } = useQuery({
26+
// ^? const data: Ref<string> | Ref<undefined>
27+
queryKey: ['test'],
28+
queryFn: () => Promise.resolve(5),
29+
select: (data) => data.toString(),
30+
})
31+
```
2032

21-
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUKEiw49AB7AIqUuUpV5i1GPESYeMOjgBxcsjBwAvIjjAAJgC44jZCABGuIhImsIzeCXQYVgALEwgzZSsACgBKRwAFVWAMAB4wswBtAF0APks8jSUAOgBzQKiqThLTMC0Yophg9EYoqHRUSGZDCzy2jt8MItt6BhivcR8-a2GGIksUDGxcPCiMqmrw2qosgBpSQJD02rHxTk44C8uAPQB+CSA)
33+
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUBNYRm8JABN6DInAC8KDNlx4AFAglw4nTodNwAegH4DcIdoDS6PAC44AbSox0LKgF0ANDZ2+ABijK46AJRqAHxwAArkIMAYAHRQ3hAANtzoOgCskYHihhhZ6KwwEYoM0apxNfSpMBAAyjBQwIwA5lHFhJFAA)
2234

23-
[//]: # 'Playground3'
24-
[//]: # 'Playground4'
35+
[//]: # 'TypeInference2'
36+
[//]: # 'TypeInference3'
37+
38+
```tsx
39+
const fetchGroups = (): Promise<Group[]> =>
40+
axios.get('/groups').then((response) => response.data)
41+
42+
const { data } = useQuery({ queryKey: ['groups'], queryFn: fetchGroups })
43+
// ^? const data: Ref<Group[]> | Ref<undefined>
44+
```
45+
46+
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUKEiw49AB7AIqUuUpV5i1GPESYeMOjgBxcsjBwAvIjjAAJgC44jZCABGuIhImsIzeCXQYVgALEwgzZSsACgBKRwAFVWAMAB4wswBtAF0APksciThZBSUAOgBzQKiqTnLTMC0Y0phg9EYoqKh0VEhmdBj8uC6e3wxS23oGGK9xHz9rCYYiSxQMbFw8KKQhDYBpdDxHDKo68IaqLIAaOB38ADFGRwCg0PrlQmnxTk4i37gAPQA-EA)
47+
48+
[//]: # 'TypeInference3'
49+
[//]: # 'TypeNarrowing'
50+
51+
```tsx
52+
const { data, isSuccess } = reactive(useQuery({
53+
queryKey: ['test'],
54+
queryFn: () => Promise.resolve(5),
55+
}))
56+
57+
if (isSuccess) {
58+
data
59+
// ^? const data: number
60+
}
61+
```
2562

2663
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUKEixEcKOnqsYwbuiKlylKr3RUA3BImsIzeEgAm9BgBo4wVAGVkrVulSp1AXjkKlK9AAUaFjCeAEA2lQwbjBUALq2AQCUcJ4AfHAACpr26AB08qgQADaqAQCsSVWGkiRwAfZOLm6oKQgScJ1wlgwSnJydAHoA-BKEEkA)
2764

28-
[//]: # 'Playground4'
29-
[//]: # 'Playground5'
65+
[//]: # 'TypeNarrowing'
66+
[//]: # 'TypingError'
3067

31-
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUKEiw49AB7AIqUuUpV5i1GPESYeMOjgBxcsjBwAvIjjAAJgC44jZCABGuIhImsIzeCXQYVgALEwgzZSsACgBKRwAFVWAMAB4wswBtAF0APks8jSUAOgBzQKiqThLTMC0Yophg9EYoqHRUSGZDCzy2jt8MItt6BhivcR8-a1xyKCJLFAxsXDwojKpq8NqqLIAaUkCQ9Nqx8U5OOEurgD0AfnHgEjgomegbPyZWdAgngFEoWYxRASS6vKASc5wO4SQhAA)
68+
```tsx
69+
const { error } = useQuery({ queryKey: ['groups'], queryFn: fetchGroups })
70+
// ^? const error: Ref<unknown>
3271

33-
[//]: # 'Playground5'
34-
[//]: # 'Playground6'
72+
if (error.value instanceof Error) {
73+
error.value
74+
// ^? const error: Error
75+
}
76+
```
3577

36-
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUKEiw49AB7AIqUuUpV5i1GPESYeMOjgBxcsjBwAvIjjAAJgC44jZCABGuIhImsIzeCXQYVgALEwgzZSsACgBKRwAFVWAMAB4wswBtAF0APks8jSUAOgBzQKiqThLTMC0Yophg9EYoqHRUSGZDCzy2jt8MItt6BhivcR8-a1xyKCJLFAxsXDw0muyAGjgAUShZnKiMqmrw2qosrYCg0JrUMfFOTjhnl4A9AH4JIA)
78+
[typescript playground](https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAbzgVwM4FMCKz1QJ5wC+cAZlBCHAOQACMAhgHaoMDGA1gPQBuOAtAEcc+KgFgAUKEiw49AB7AIqUuUpV5i1GPESYeMOjgBxcsjBwAvIjjAAJgC44jZCABGuIhImsIzeCXQYVgALEwgzZSsACgBKRwAFVWAMAB4wswBtAF0APks8jSUAOgBzQKiqThLTMC0Yophg9EYoqHRUSGZDCzy2jt8MItt6BhivcR8-a1xyKCJLFAxsXDwopCEVgGl0PEcMqmrw2qosgBo4DfwAMUZHAKDQmuVCMfFOTjhPr4A9AH44SYsOAzaCOABK6BIKWQjHYjAgAHdGDlxsASHAoiCoEVuPQADY4Gx+JisdAQdEAUSgsxiiAknyxOPxOHpcHeX0+fwBA3gWMcVNmEkIQA)
3779

38-
[//]: # 'Playground6'
80+
[//]: # 'TypingError'
81+
[//]: # 'TypingError2'
82+
[//]: # 'TypingError2'
3983
[//]: # 'Materials'
4084
[//]: # 'Materials'

0 commit comments

Comments
 (0)