Skip to content

Commit

Permalink
fix(types): Add TypeScript definitions for status flags (#595)
Browse files Browse the repository at this point in the history
  • Loading branch information
JakeGinnivan committed Jun 22, 2020
1 parent 5291ed7 commit 007b9b4
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
21 changes: 21 additions & 0 deletions types/index.d.ts
Expand Up @@ -370,6 +370,9 @@ export type QueryStatus = 'idle' | 'loading' | 'error' | 'success'
export interface QueryResultBase<TResult, TError = Error> {
status: QueryStatus
error: null | TError
isLoading: boolean
isSuccess: boolean
isError: boolean
isFetching: boolean
isStale: boolean
failureCount: number
Expand All @@ -379,19 +382,28 @@ export interface QueryResultBase<TResult, TError = Error> {
export interface QueryLoadingResult<TResult, TError = Error>
extends QueryResultBase<TResult, TError> {
status: 'loading'
isLoading: true
isSuccess: false
isError: false
data: TResult | undefined // even when error, data can have stale data
error: TError | null // it still can be error
}

export interface QueryErrorResult<TResult, TError = Error>
extends QueryResultBase<TResult, TError> {
status: 'error'
isError: true
isLoading: false
isSuccess: false
data: TResult | undefined // even when error, data can have stale data
error: TError
}

export interface QuerySuccessResult<TResult> extends QueryResultBase<TResult> {
status: 'success'
isSuccess: true
isLoading: false
isError: false
data: TResult
error: null
}
Expand All @@ -404,6 +416,9 @@ export type QueryResult<TResult, TError = Error> =
export interface PaginatedQueryLoadingResult<TResult, TError = Error>
extends QueryResultBase<TResult, TError> {
status: 'loading'
isLoading: true
isError: false
isSuccess: false
resolvedData: undefined | TResult // even when error, data can have stale data
latestData: undefined | TResult // even when error, data can have stale data
error: null | TError // it still can be error
Expand All @@ -412,6 +427,9 @@ export interface PaginatedQueryLoadingResult<TResult, TError = Error>
export interface PaginatedQueryErrorResult<TResult, TError = Error>
extends QueryResultBase<TResult, TError> {
status: 'error'
isError: true
isLoading: false
isSuccess: false
resolvedData: undefined | TResult // even when error, data can have stale data
latestData: undefined | TResult // even when error, data can have stale data
error: TError
Expand All @@ -420,6 +438,9 @@ export interface PaginatedQueryErrorResult<TResult, TError = Error>
export interface PaginatedQuerySuccessResult<TResult>
extends QueryResultBase<TResult> {
status: 'success'
isSuccess: true
isError: false
isLoading: false
resolvedData: TResult
latestData: TResult
error: null
Expand Down
37 changes: 37 additions & 0 deletions types/test.ts
Expand Up @@ -182,6 +182,25 @@ function paginatedQuery() {
queryPaginated.latestData // $ExpectType { data: number[]; next: boolean; }
queryPaginated.error // $ExpectType null
}

// Discriminated union over status flags
if (queryPaginated.isLoading) {
queryPaginated.resolvedData // $ExpectType { data: number[]; next: boolean; } | undefined
queryPaginated.latestData // $ExpectType { data: number[]; next: boolean; } | undefined
queryPaginated.error // $ExpectType Error | null
}

if (queryPaginated.isError) {
queryPaginated.resolvedData // $ExpectType { data: number[]; next: boolean; } | undefined
queryPaginated.latestData // $ExpectType { data: number[]; next: boolean; } | undefined
queryPaginated.error // $ExpectType Error
}

if (queryPaginated.isSuccess) {
queryPaginated.resolvedData // $ExpectType { data: number[]; next: boolean; }
queryPaginated.latestData // $ExpectType { data: number[]; next: boolean; }
queryPaginated.error // $ExpectType null
}
}

function paginatedQueryWithObjectSyntax(condition: boolean) {
Expand Down Expand Up @@ -412,6 +431,24 @@ function dataDiscriminatedUnion() {
queryResult.data // $ExpectType string[]
queryResult.error // $ExpectType null
}

// Discriminated union over status flags
if (queryResult.isLoading) {
queryResult.data // $ExpectType string[] | undefined
queryResult.error // $ExpectType Error | null
}

if (queryResult.isError) {
// disabled
queryResult.data // $ExpectType string[] | undefined
queryResult.error // $ExpectType Error
}

if (queryResult.isSuccess) {
// disabled
queryResult.data // $ExpectType string[]
queryResult.error // $ExpectType null
}
}

function mutationStatusDiscriminatedUnion() {
Expand Down
14 changes: 14 additions & 0 deletions yarn.lock
Expand Up @@ -358,6 +358,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5"
integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==

"@babel/helper-validator-identifier@^7.10.3":
version "7.10.3"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz#60d9847f98c4cea1b279e005fdb7c28be5412d15"
integrity sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==

"@babel/helper-wrap-function@^7.10.1":
version "7.10.1"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9"
Expand Down Expand Up @@ -404,6 +409,15 @@
chalk "^2.0.0"
js-tokens "^4.0.0"

"@babel/highlight@^7.8.3":
version "7.10.3"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.3.tgz#c633bb34adf07c5c13156692f5922c81ec53f28d"
integrity sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==
dependencies:
"@babel/helper-validator-identifier" "^7.10.3"
chalk "^2.0.0"
js-tokens "^4.0.0"

"@babel/parser@^7.1.0", "@babel/parser@^7.7.4":
version "7.7.4"
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb"
Expand Down

0 comments on commit 007b9b4

Please sign in to comment.