import { customRef, onBeforeUnmount, Ref, watch } from "vue" export function pluckRef(ref: Ref, key: K): Ref { return customRef((track, trigger) => { const stopWatching = watch(ref, (newVal, oldVal) => { if (newVal[key] !== oldVal[key]) { trigger() } }) onBeforeUnmount(() => { stopWatching() }) return { get() { track() return ref.value[key] }, set(value: T[K]) { trigger() ref.value = Object.assign(ref.value, { [key]: value }) }, } }) } export function pluckMultipleFromRef>( sourceRef: Ref, keys: K ): { [key in K[number]]: Ref } { return Object.fromEntries(keys.map((x) => [x, pluckRef(sourceRef, x)])) as any }