expectType<string>(c.value)
})
+describe('Type safety for `WritableComputedRef` and `ComputedRef`', () => {
+ // @ts-expect-error
+ const writableComputed: WritableComputedRef<string> = computed(() => '')
+ // should allow
+ const immutableComputed: ComputedRef<string> = writableComputed
+ expectType<ComputedRef<string>>(immutableComputed)
+})
+
// shallowRef
type Status = 'initial' | 'ready' | 'invalidating'
const shallowStatus = shallowRef<Status>('initial')
import { ReactiveFlags, TrackOpTypes } from './constants'
declare const ComputedRefSymbol: unique symbol
+declare const WritableComputedRefSymbol: unique symbol
-export interface ComputedRef<T = any> extends WritableComputedRef<T> {
- readonly value: T
+interface BaseComputedRef<T, S = T> extends Ref<T, S> {
[ComputedRefSymbol]: true
-}
-
-export interface WritableComputedRef<T, S = T> extends Ref<T, S> {
/**
* @deprecated computed no longer uses effect
*/
effect: ComputedRefImpl
}
+export interface ComputedRef<T = any> extends BaseComputedRef<T> {
+ readonly value: T
+}
+
+export interface WritableComputedRef<T, S = T> extends BaseComputedRef<T, S> {
+ [WritableComputedRefSymbol]: true
+}
+
export type ComputedGetter<T> = (oldValue?: T) => T
export type ComputedSetter<T> = (newValue: T) => void