expectType<IsAny<typeof a>>(false)
}
-describe('shallowRef with generic', <T>() => {
- const r = ref({}) as MaybeRef<T>
- expectType<ShallowRef<T> | Ref<T>>(shallowRef(r))
+describe('shallowRef with generic', <T extends { name: string }>() => {
+ const r = {} as T
+ const s = shallowRef(r)
+ expectType<string>(s.value.name)
+ expectType<ShallowRef<T>>(shallowRef(r))
})
+{
+ // should return ShallowRef<T> | Ref<T>, not ShallowRef<T | Ref<T>>
+ expectType<ShallowRef<{ name: string }> | Ref<{ name: string }>>(
+ shallowRef({} as MaybeRef<{ name: string }>)
+ )
+ expectType<ShallowRef<number> | Ref<string[]> | ShallowRef<string>>(
+ shallowRef('' as Ref<string[]> | string | number)
+ )
+}
+
// proxyRefs: should return `reactive` directly
const r1 = reactive({
k: 'v'
* @param value - The "inner value" for the shallow ref.
* @see {@link https://vuejs.org/api/reactivity-advanced.html#shallowref}
*/
-export function shallowRef<T>(value: MaybeRef<T>): Ref<T> | ShallowRef<T>
-export function shallowRef<T extends Ref>(value: T): T
-export function shallowRef<T>(value: T): ShallowRef<T>
+export function shallowRef<T>(
+ value: T
+): Ref extends T
+ ? T extends Ref
+ ? IfAny<T, ShallowRef<T>, T>
+ : ShallowRef<T>
+ : ShallowRef<T>
export function shallowRef<T = any>(): ShallowRef<T | undefined>
export function shallowRef(value?: unknown) {
return createRef(value, true)