]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(types): allow computed getter and setter types to be unrelated (#11472)
author远方os <yangpanteng@gmail.com>
Mon, 5 Aug 2024 02:51:56 +0000 (10:51 +0800)
committerGitHub <noreply@github.com>
Mon, 5 Aug 2024 02:51:56 +0000 (10:51 +0800)
close #7271

packages/dts-test/ref.test-d.ts
packages/reactivity/src/computed.ts

index f8f2500aa1d0b639702451ea96e89031eba574ea..b6e055dfb4b608d81c05633d0c244ca5ef238295 100644 (file)
@@ -184,6 +184,26 @@ describe('allow getter and setter types to be unrelated', <T>() => {
   e.value = d
 })
 
+// computed
+describe('allow computed getter and setter types to be unrelated', () => {
+  const obj = ref({
+    name: 'foo',
+  })
+
+  const c = computed({
+    get() {
+      return JSON.stringify(obj.value)
+    },
+    set(val: typeof obj.value) {
+      obj.value = val
+    },
+  })
+
+  c.value = { name: 'bar' } // object
+
+  expectType<string>(c.value)
+})
+
 // shallowRef
 type Status = 'initial' | 'ready' | 'invalidating'
 const shallowStatus = shallowRef<Status>('initial')
index 5dedecfe6bb2367bdd90705c7d0a5a4fcdd82b42..06a287fcd887ef73bfcf7ecf89c5e4a3a50a8c85 100644 (file)
@@ -20,7 +20,7 @@ export interface ComputedRef<T = any> extends WritableComputedRef<T> {
   [ComputedRefSymbol]: true
 }
 
-export interface WritableComputedRef<T> extends Ref<T> {
+export interface WritableComputedRef<T, S = T> extends Ref<T, S> {
   /**
    * @deprecated computed no longer uses effect
    */
@@ -30,9 +30,9 @@ export interface WritableComputedRef<T> extends Ref<T> {
 export type ComputedGetter<T> = (oldValue?: T) => T
 export type ComputedSetter<T> = (newValue: T) => void
 
-export interface WritableComputedOptions<T> {
+export interface WritableComputedOptions<T, S = T> {
   get: ComputedGetter<T>
-  set: ComputedSetter<T>
+  set: ComputedSetter<S>
 }
 
 /**
@@ -175,10 +175,10 @@ export function computed<T>(
   getter: ComputedGetter<T>,
   debugOptions?: DebuggerOptions,
 ): ComputedRef<T>
-export function computed<T>(
-  options: WritableComputedOptions<T>,
+export function computed<T, S = T>(
+  options: WritableComputedOptions<T, S>,
   debugOptions?: DebuggerOptions,
-): WritableComputedRef<T>
+): WritableComputedRef<T, S>
 export function computed<T>(
   getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,
   debugOptions?: DebuggerOptions,