8000 feat(useVModel): improve types overload (#3055) · vueuse/vueuse@7d788aa · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 7d788aa

Browse files
authored
feat(useVModel): improve types overload (#3055)
1 parent db4f27f commit 7d788aa

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

packages/core/useVModel/index.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { isDef } from '@vueuse/shared'
2-
import type { UnwrapRef } from 'vue-demi'
2+
import type { Ref, UnwrapRef, WritableComputedRef } from 'vue-demi'
33
import { computed, getCurrentInstance, isVue2, ref, watch } from 'vue-demi'
44
import type { CloneFn } from '../useCloned'
55
import { cloneFnJSON } from '../useCloned'
66

7-
export interface UseVModelOptions<T> {
7+
export interface UseVModelOptions<T, Passive extends boolean = false> {
88
/**
99
* When passive is set to `true`, it will use `watch` to sync with props and ref.
1010
* Instead of relying on the `v-model` or `.sync` to work.
1111
*
1212
* @default false
1313
*/
14-
passive?: boolean
14+
passive?: Passive
1515
/**
1616
* When eventName is set, it's value will be used to overwrite the emit event name.
1717
*
@@ -48,6 +48,20 @@ export interface UseVModelOptions<T> {
4848
shouldEmit?: (v: T) => boolean
4949
}
5050

51+
export function useVModel<P extends object, K extends keyof P, Name extends string>(
52+
props: P,
53+
key?: K,
54+
emit?: (name: Name, ...args: any[]) => void,
55+
options?: UseVModelOptions<P[K], false>,
56+
): WritableComputedRef<P[K]>
57+
58+
export function useVModel<P extends object, K extends keyof P, Name extends string>(
59+
props: P,
60+
key?: K,
61+
emit?: (name: Name, ...args: any[]) => void,
62+
options?: UseVModelOptions<P[K], true>,
63+
): Ref<UnwrapRef<P[K]>>
64+
5165
/**
5266
* Shorthand for v-model binding, props + emit -> ref
5367
*
@@ -56,11 +70,11 @@ export interface UseVModelOptions<T> {
5670
* @param key (default 'value' in Vue 2 and 'modelValue' in Vue 3)
5771
* @param emit
5872
*/
59-
export function useVModel<P extends object, K extends keyof P, Name extends string>(
73+
export function useVModel<P extends object, K extends keyof P, Name extends string, Passive extends boolean>(
6074
props: P,
6175
key?: K,
6276
emit?: (name: Name, ...args: any[]) => void,
63-
options: UseVModelOptions<P[K]> = {},
77+
options: UseVModelOptions<P[K], Passive> = {},
6478
) {
6579
const {
6680
clone = false,

0 commit comments

Comments
 (0)
0