diff --git a/types/index.d.ts b/types/index.d.ts index c9606956d9..69a2da6021 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -370,6 +370,9 @@ export type QueryStatus = 'idle' | 'loading' | 'error' | 'success' export interface QueryResultBase { status: QueryStatus error: null | TError + isLoading: boolean + isSuccess: boolean + isError: boolean isFetching: boolean isStale: boolean failureCount: number @@ -379,6 +382,9 @@ export interface QueryResultBase { export interface QueryLoadingResult extends QueryResultBase { 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 } @@ -386,12 +392,18 @@ export interface QueryLoadingResult export interface QueryErrorResult extends QueryResultBase { status: 'error' + isError: true + isLoading: false + isSuccess: false data: TResult | undefined // even when error, data can have stale data error: TError } export interface QuerySuccessResult extends QueryResultBase { status: 'success' + isSuccess: true + isLoading: false + isError: false data: TResult error: null } @@ -404,6 +416,9 @@ export type QueryResult = export interface PaginatedQueryLoadingResult extends QueryResultBase { 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 @@ -412,6 +427,9 @@ export interface PaginatedQueryLoadingResult export interface PaginatedQueryErrorResult extends QueryResultBase { 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 @@ -420,6 +438,9 @@ export interface PaginatedQueryErrorResult export interface PaginatedQuerySuccessResult extends QueryResultBase { status: 'success' + isSuccess: true + isError: false + isLoading: false resolvedData: TResult latestData: TResult error: null diff --git a/types/test.ts b/types/test.ts index 2d132be5e4..4d8749f911 100644 --- a/types/test.ts +++ b/types/test.ts @@ -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) { @@ -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() { diff --git a/yarn.lock b/yarn.lock index 4cf539d800..f06cd9a4b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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" @@ -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"