Skip to content

Commit 319d821

Browse files
authored
feat(shared): Introduce TimerHandle for setTimeout type (#4801)
1 parent c424f98 commit 319d821

File tree

8 files changed

+28
-20
lines changed

8 files changed

+28
-20
lines changed

packages/core/onLongPress/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { TimerHandle } from '@vueuse/shared'
12
import type { Position } from '../types'
23
import type { MaybeElementRef } from '../unrefElement'
34
import { computed } from 'vue'
@@ -48,7 +49,7 @@ export function onLongPress(
4849
) {
4950
const elementRef = computed(() => unrefElement(target))
5051

51-
let timeout: ReturnType<typeof setTimeout> | undefined
52+
let timeout: TimerHandle
5253
let posStart: Position | undefined
5354
let startTimestamp: number | undefined
5455
let hasLongPressed = false

packages/core/useElementHover/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { TimerHandle } from '@vueuse/shared'
12
import type { MaybeRefOrGetter, ShallowRef } from 'vue'
23
import type { ConfigurableWindow } from '../_configurable'
34
import type { MaybeComputedElementRef } from '../unrefElement'
@@ -22,7 +23,7 @@ export function useElementHover(el: MaybeRefOrGetter<EventTarget | null | undefi
2223
} = options
2324

2425
const isHovered = shallowRef(false)
25-
let timer: ReturnType<typeof setTimeout> | undefined
26+
let timer: TimerHandle
2627

2728
const toggle = (entering: boolean) => {
2829
const delay = entering ? delayEnter : delayLeave

packages/core/useIdle/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ConfigurableEventFilter } from '@vueuse/shared'
1+
import type { ConfigurableEventFilter, TimerHandle } from '@vueuse/shared'
22
import type { ShallowRef } from 'vue'
33
import type { ConfigurableWindow } from '../_configurable'
44
import type { WindowEventName } from '../useEventListener'
@@ -58,7 +58,7 @@ export function useIdle(
5858
const idle = shallowRef(initialState)
5959
const lastActive = shallowRef(timestamp())
6060

61-
let timer: any
61+
let timer: TimerHandle
6262

6363
const reset = () => {
6464
idle.value = false

packages/core/useWebSocket/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Fn } from '@vueuse/shared'
1+
import type { Fn, TimerHandle } from '@vueuse/shared'
22
import type { MaybeRefOrGetter, Ref, ShallowRef } from 'vue'
33
import { isClient, isWorker, toRef, tryOnScopeDispose, useIntervalFn } from '@vueuse/shared'
44
import { ref as deepRef, shallowRef, toValue, watch } from 'vue'
@@ -183,8 +183,8 @@ export function useWebSocket<Data = any>(
183183

184184
let bufferedData: (string | ArrayBuffer | Blob)[] = []
185185

186-
let retryTimeout: ReturnType<typeof setTimeout> | undefined
187-
let pongTimeoutWait: ReturnType<typeof setTimeout> | undefined
186+
let retryTimeout: TimerHandle
187+
let pongTimeoutWait: TimerHandle
188188

189189
const _sendBuffer = () => {
190190
if (bufferedData.length && wsRef.value && status.value === 'OPEN') {

packages/shared/refAutoReset/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { MaybeRefOrGetter, Ref } from 'vue'
2+
import type { TimerHandle } from '../utils'
23
import { customRef, toValue } from 'vue'
34
import { tryOnScopeDispose } from '../tryOnScopeDispose'
45

@@ -14,7 +15,7 @@ export type RefAutoResetReturn<T = any> = Ref<T>
1415
export function refAutoReset<T>(defaultValue: MaybeRefOrGetter<T>, afterMs: MaybeRefOrGetter<number> = 10000): RefAutoResetReturn<T> {
1516
return customRef<T>((track, trigger) => {
1617
let value: T = toValue(defaultValue)
17-
let timer: any
18+
let timer: TimerHandle
1819

1920
const resetAfter = () =>
2021
setTimeout(() => {

packages/shared/useTimeoutFn/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { MaybeRefOrGetter } from 'vue'
2-
import type { AnyFn, Stoppable } from '../utils'
2+
import type { AnyFn, Stoppable, TimerHandle } from '../utils'
33
import { shallowReadonly, shallowRef, toValue } from 'vue'
44
import { tryOnScopeDispose } from '../tryOnScopeDispose'
55
import { isClient } from '../utils'
@@ -41,12 +41,12 @@ export function useTimeoutFn<CallbackFn extends AnyFn>(
4141

4242
const isPending = shallowRef(false)
4343

44-
let timer: ReturnType<typeof setTimeout> | null = null
44+
let timer: TimerHandle
4545

4646
function clear() {
4747
if (timer) {
4848
clearTimeout(timer)
49-
timer = null
49+
timer = undefined
5050
}
5151
}
5252

@@ -62,7 +62,7 @@ export function useTimeoutFn<CallbackFn extends AnyFn>(
6262
isPending.value = true
6363
timer = setTimeout(() => {
6464
isPending.value = false
65-
timer = null
65+
timer = undefined
6666

6767
cb(...args)
6868
}, toValue(interval))

packages/shared/utils/filters.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { MaybeRefOrGetter } from 'vue'
2-
import type { AnyFn, ArgumentsType, Awaited, Pausable, Promisify } from './types'
2+
import type { AnyFn, ArgumentsType, Awaited, Pausable, Promisify, TimerHandle } from './types'
33
import { isRef, readonly, toValue } from 'vue'
44
import { toRef } from '../toRef'
55
import { noop } from './is'
@@ -65,11 +65,11 @@ export const bypassFilter: EventFilter = (invoke) => {
6565
* Create an EventFilter that debounce the events
6666
*/
6767
export function debounceFilter(ms: MaybeRefOrGetter<number>, options: DebounceFilterOptions = {}) {
68-
let timer: ReturnType<typeof setTimeout> | undefined
69-
let maxTimer: ReturnType<typeof setTimeout> | undefined | null
68+
let timer: TimerHandle
69+
let maxTimer: TimerHandle
7070
let lastRejector: AnyFn = noop
7171

72-
const _clearTimeout = (timer: ReturnType<typeof setTimeout>) => {
72+
const _clearTimeout = (timer: TimerHandle) => {
7373
clearTimeout(timer)
7474
lastRejector()
7575
lastRejector = noop
@@ -87,7 +87,7 @@ export function debounceFilter(ms: MaybeRefOrGetter<number>, options: DebounceFi
8787
if (duration <= 0 || (maxDuration !== undefined && maxDuration <= 0)) {
8888
if (maxTimer) {
8989
_clearTimeout(maxTimer)
90-
maxTimer = null
90+
maxTimer = undefined
9191
}
9292
return Promise.resolve(invoke())
9393
}
@@ -100,7 +100,7 @@ export function debounceFilter(ms: MaybeRefOrGetter<number>, options: DebounceFi
100100
maxTimer = setTimeout(() => {
101101
if (timer)
102102
_clearTimeout(timer)
103-
maxTimer = null
103+
maxTimer = undefined
104104
resolve(lastInvoker())
105105
}, maxDuration)
106106
}
@@ -109,7 +109,7 @@ export function debounceFilter(ms: MaybeRefOrGetter<number>, options: DebounceFi
109109
timer = setTimeout(() => {
110110
if (maxTimer)
111111
_clearTimeout(maxTimer)
112-
maxTimer = null
112+
maxTimer = undefined
113113
resolve(invoke())
114114
}, duration)
115115
})
@@ -150,7 +150,7 @@ export function throttleFilter(ms: MaybeRefOrGetter<number>, trailing?: boolean,
150150
export function throttleFilter(options: ThrottleFilterOptions): EventFilter
151151
export function throttleFilter(...args: any[]) {
152152
let lastExec = 0
153-
let timer: ReturnType<typeof setTimeout> | undefined
153+
let timer: TimerHandle
154154
let isLeading = true
155155
let lastRejector: AnyFn = noop
156156
let lastValue: any

packages/shared/utils/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,8 @@ export type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N
148148
* will return `true` if `T` is `any`, or `false` otherwise
149149
*/
150150
export type IsAny<T> = IfAny<T, true, false>
151+
152+
/**
153+
* Universal timer handle that works in both browser and Node.js environments
154+
*/
155+
export type TimerHandle = ReturnType<typeof setTimeout> | undefined

0 commit comments

Comments
 (0)