]> git.ipfire.org Git - thirdparty/vuejs/pinia.git/commitdiff
fix(types): custom Awaited for TS 4.x
authorEduardo San Martin Morote <posva13@gmail.com>
Thu, 27 Jan 2022 10:50:32 +0000 (11:50 +0100)
committerEduardo San Martin Morote <posva13@gmail.com>
Thu, 27 Jan 2022 10:50:32 +0000 (11:50 +0100)
Fix #957

packages/pinia/src/types.ts

index 5b2d3dad7f0f0be7ae258cbc9908823a4e5d33db..20a0c5323c3126922cb28493302ca4d38d300255 100644 (file)
@@ -159,6 +159,16 @@ export type SubscriptionCallback<S> = (
   state: UnwrapRef<S>
 ) => void
 
+// to support TS 4.4
+// TODO: remove in 2.1.0, use Awaited, and up the peer dep to TS 4.5
+type _Awaited<T> = T extends null | undefined
+  ? T // special case for `null | undefined` when not in `--strictNullChecks` mode
+  : T extends object & { then(onfulfilled: infer F): any } // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped
+  ? F extends (value: infer V, ...args: any) => any // if the argument to `then` is callable, extracts the first argument
+    ? Awaited<V> // recursively unwrap the value
+    : never // the argument to `then` was not callable
+  : T // non-object or non-thenable
+
 /**
  * Actual type for {@link StoreOnActionListenerContext}. Exists for refactoring
  * purposes. For internal use only.
@@ -194,12 +204,12 @@ export interface _StoreOnActionListenerContext<
   after: (
     callback: A extends Record<ActionName, _Method>
       ? (
-          resolvedReturn: Awaited<ReturnType<A[ActionName]>>
+          resolvedReturn: _Awaited<ReturnType<A[ActionName]>>
           // allow the after callback to override the return value
         ) =>
           | void
           | ReturnType<A[ActionName]>
-          | Awaited<ReturnType<A[ActionName]>>
+          | _Awaited<ReturnType<A[ActionName]>>
       : () => void
   ) => void