From: Tycho Date: Wed, 14 Aug 2024 07:11:10 +0000 (+0800) Subject: fix(types/computed): ensure type safety for `WritableComputedRef` (#11608) X-Git-Tag: v3.5.0-beta.2~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5cf5a1620d9a97382d386c277265d9dd051fe484;p=thirdparty%2Fvuejs%2Fcore.git fix(types/computed): ensure type safety for `WritableComputedRef` (#11608) --- diff --git a/packages-private/dts-test/ref.test-d.ts b/packages-private/dts-test/ref.test-d.ts index 89dbeacb38..929e3d1a1a 100644 --- a/packages-private/dts-test/ref.test-d.ts +++ b/packages-private/dts-test/ref.test-d.ts @@ -209,6 +209,14 @@ describe('allow computed getter and setter types to be unrelated', () => { expectType(c.value) }) +describe('Type safety for `WritableComputedRef` and `ComputedRef`', () => { + // @ts-expect-error + const writableComputed: WritableComputedRef = computed(() => '') + // should allow + const immutableComputed: ComputedRef = writableComputed + expectType>(immutableComputed) +}) + // shallowRef type Status = 'initial' | 'ready' | 'invalidating' const shallowStatus = shallowRef('initial') diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index bb9f9e02fc..aa5d207906 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -14,19 +14,24 @@ import { Dep, globalVersion } from './dep' import { ReactiveFlags, TrackOpTypes } from './constants' declare const ComputedRefSymbol: unique symbol +declare const WritableComputedRefSymbol: unique symbol -export interface ComputedRef extends WritableComputedRef { - readonly value: T +interface BaseComputedRef extends Ref { [ComputedRefSymbol]: true -} - -export interface WritableComputedRef extends Ref { /** * @deprecated computed no longer uses effect */ effect: ComputedRefImpl } +export interface ComputedRef extends BaseComputedRef { + readonly value: T +} + +export interface WritableComputedRef extends BaseComputedRef { + [WritableComputedRefSymbol]: true +} + export type ComputedGetter = (oldValue?: T) => T export type ComputedSetter = (newValue: T) => void diff --git a/packages/runtime-core/src/apiComputed.ts b/packages/runtime-core/src/apiComputed.ts index a7d959dfaa..2ebb2d4e63 100644 --- a/packages/runtime-core/src/apiComputed.ts +++ b/packages/runtime-core/src/apiComputed.ts @@ -13,5 +13,5 @@ export const computed: typeof _computed = ( ;(c as unknown as ComputedRefImpl)._warnRecursive = true } } - return c + return c as any }