Skip to content

Commit

Permalink
feat(useVModel): improve types overload (#3055)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mini-ghost committed May 4, 2023
1 parent db4f27f commit 7d788aa
Showing 1 changed file with 19 additions and 5 deletions.
24 changes: 19 additions & 5 deletions packages/core/useVModel/index.ts
@@ -1,17 +1,17 @@
import { isDef } from '@vueuse/shared'
import type { UnwrapRef } from 'vue-demi'
import type { Ref, UnwrapRef, WritableComputedRef } from 'vue-demi'
import { computed, getCurrentInstance, isVue2, ref, watch } from 'vue-demi'
import type { CloneFn } from '../useCloned'
import { cloneFnJSON } from '../useCloned'

export interface UseVModelOptions<T> {
export interface UseVModelOptions<T, Passive extends boolean = false> {
/**
* When passive is set to `true`, it will use `watch` to sync with props and ref.
* Instead of relying on the `v-model` or `.sync` to work.
*
* @default false
*/
passive?: boolean
passive?: Passive
/**
* When eventName is set, it's value will be used to overwrite the emit event name.
*
Expand Down Expand Up @@ -48,6 +48,20 @@ export interface UseVModelOptions<T> {
shouldEmit?: (v: T) => boolean
}

export function useVModel<P extends object, K extends keyof P, Name extends string>(
props: P,
key?: K,
emit?: (name: Name, ...args: any[]) => void,
options?: UseVModelOptions<P[K], false>,
): WritableComputedRef<P[K]>

export function useVModel<P extends object, K extends keyof P, Name extends string>(
props: P,
key?: K,
emit?: (name: Name, ...args: any[]) => void,
options?: UseVModelOptions<P[K], true>,
): Ref<UnwrapRef<P[K]>>

/**
* Shorthand for v-model binding, props + emit -> ref
*
Expand All @@ -56,11 +70,11 @@ export interface UseVModelOptions<T> {
* @param key (default 'value' in Vue 2 and 'modelValue' in Vue 3)
* @param emit
*/
export function useVModel<P extends object, K extends keyof P, Name extends string>(
export function useVModel<P extends object, K extends keyof P, Name extends string, Passive extends boolean>(
props: P,
key?: K,
emit?: (name: Name, ...args: any[]) => void,
options: UseVModelOptions<P[K]> = {},
options: UseVModelOptions<P[K], Passive> = {},
) {
const {
clone = false,
Expand Down

0 comments on commit 7d788aa

Please sign in to comment.