8000 feat: add `Promisify` type definition (#3420) · vueuse/vueuse@b067b8e · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit b067b8e

Browse files
feat: add Promisify type definition (#3420)
1 parent 8e4c01b commit b067b8e

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

packages/shared/utils/filters.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { readonly, ref } from 'vue-demi'
22
import { toValue } from '../toValue'
33
import { noop } from './is'
4-
import type { AnyFn, ArgumentsType, MaybeRefOrGetter, Pausable } from './types'
4+
import type { AnyFn, ArgumentsType, Awaited, MaybeRefOrGetter, Pausable, Promisify } from './types'
55

66
export type FunctionArgs<Args extends any[] = any[], Return = void> = (...args: Args) => Return
77

@@ -14,7 +14,7 @@ export interface FunctionWrapperOptions<Args extends any[] = any[], This = any>
1414
export type EventFilter<Args extends any[] = any[], This = any, Invoke extends AnyFn = AnyFn> = (
1515
invoke: Invoke,
1616
options: FunctionWrapperOptions<Args, This>
17-
) => ReturnType<Invoke> | Promise<ReturnType<Invoke>>
17+
) => ReturnType<Invoke> | Promisify<ReturnType<Invoke>>
1818

1919
export interface ConfigurableEventFilter {
2020
/**
@@ -45,7 +45,7 @@ export interface DebounceFilterOptions {
4545
*/
4646
export function createFilterWrapper<T extends AnyFn>(filter: EventFilter, fn: T) {
4747
function wrapper(this: any, ...args: ArgumentsType<T>) {
48-
return new Promise<ReturnType<T>>((resolve, reject) => {
48+
return new Promise<Awaited<ReturnType<T>>>((resolve, reject) => {
4949
// make sure it's a promise
5050
Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args }))
5151
.then(resolve)

packages/shared/utils/types.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,20 @@ export type Awaitable<T> = Promise<T> | T
6969

7070
export type ArgumentsType<T> = T extends (...args: infer U) => any ? U : never
7171

72-
export type PromisifyFn<T extends AnyFn> = (...args: ArgumentsType<T>) => Promise<ReturnType<T>>
72+
/**
73+
* Compatible with versions below TypeScript 4.5 Awaited
74+
*/
75+
export type Awaited<T> =
76+
T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` mode
77+
T extends object & { then(onfulfilled: infer F, ...args: infer _): any } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped
78+
F extends ((value: infer V, ...args: infer _) => any) ? // if the argument to `then` is callable, extracts the first argument
79+
Awaited<V> : // recursively unwrap the value
80+
never : // the argument to `then` was not callable
81+
T // non-object or non-thenable
82+
83+
export type Promisify<T> = Promise<Awaited<T>>
84+
85+
export type PromisifyFn<T extends AnyFn> = (...args: ArgumentsType<T>) => Promisify<ReturnType<T>>
7386

7487
export interface Pausable {
7588
/**

0 commit comments

Comments
 (0)
0