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')
[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
*/
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>
}
/**
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,