fix(types): keep the original type when unwrapping markRaw
(#3791)
This commit is contained in:
parent
67099fe202
commit
32e53bfd47
@ -11,7 +11,7 @@ import {
|
|||||||
shallowCollectionHandlers,
|
shallowCollectionHandlers,
|
||||||
shallowReadonlyCollectionHandlers
|
shallowReadonlyCollectionHandlers
|
||||||
} from './collectionHandlers'
|
} from './collectionHandlers'
|
||||||
import { UnwrapRefSimple, Ref } from './ref'
|
import { UnwrapRefSimple, Ref, RawSymbol } from './ref'
|
||||||
|
|
||||||
export const enum ReactiveFlags {
|
export const enum ReactiveFlags {
|
||||||
SKIP = '__v_skip',
|
SKIP = '__v_skip',
|
||||||
@ -241,7 +241,9 @@ export function toRaw<T>(observed: T): T {
|
|||||||
return raw ? toRaw(raw) : observed
|
return raw ? toRaw(raw) : observed
|
||||||
}
|
}
|
||||||
|
|
||||||
export function markRaw<T extends object>(value: T): T {
|
export function markRaw<T extends object>(
|
||||||
|
value: T
|
||||||
|
): T & { [RawSymbol]?: true } {
|
||||||
def(value, ReactiveFlags.SKIP, true)
|
def(value, ReactiveFlags.SKIP, true)
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import { CollectionTypes } from './collectionHandlers'
|
|||||||
import { createDep, Dep } from './dep'
|
import { createDep, Dep } from './dep'
|
||||||
|
|
||||||
declare const RefSymbol: unique symbol
|
declare const RefSymbol: unique symbol
|
||||||
|
export declare const RawSymbol: unique symbol
|
||||||
|
|
||||||
export interface Ref<T = any> {
|
export interface Ref<T = any> {
|
||||||
value: T
|
value: T
|
||||||
@ -291,6 +292,7 @@ export type UnwrapRefSimple<T> = T extends
|
|||||||
| BaseTypes
|
| BaseTypes
|
||||||
| Ref
|
| Ref
|
||||||
| RefUnwrapBailTypes[keyof RefUnwrapBailTypes]
|
| RefUnwrapBailTypes[keyof RefUnwrapBailTypes]
|
||||||
|
| { [RawSymbol]?: true }
|
||||||
? T
|
? T
|
||||||
: T extends Array<any>
|
: T extends Array<any>
|
||||||
? { [K in keyof T]: UnwrapRefSimple<T[K]> }
|
? { [K in keyof T]: UnwrapRefSimple<T[K]> }
|
||||||
|
6
test-dts/index.d.ts
vendored
6
test-dts/index.d.ts
vendored
@ -9,9 +9,9 @@ export function expectType<T>(value: T): void
|
|||||||
export function expectError<T>(value: T): void
|
export function expectError<T>(value: T): void
|
||||||
export function expectAssignable<T, T2 extends T = T>(value: T2): void
|
export function expectAssignable<T, T2 extends T = T>(value: T2): void
|
||||||
|
|
||||||
export type IsUnion<T, U extends T = T> = (T extends any
|
export type IsUnion<T, U extends T = T> = (
|
||||||
? (U extends T ? false : true)
|
T extends any ? (U extends T ? false : true) : never
|
||||||
: never) extends false
|
) extends false
|
||||||
? false
|
? false
|
||||||
: true
|
: true
|
||||||
|
|
||||||
|
@ -1,5 +1,14 @@
|
|||||||
import { shallowReadonly } from '@vue/reactivity'
|
import {
|
||||||
import { ref, readonly, describe, expectError, expectType, Ref } from './index'
|
ref,
|
||||||
|
readonly,
|
||||||
|
shallowReadonly,
|
||||||
|
describe,
|
||||||
|
expectError,
|
||||||
|
expectType,
|
||||||
|
Ref,
|
||||||
|
reactive,
|
||||||
|
markRaw
|
||||||
|
} from './index'
|
||||||
|
|
||||||
describe('should support DeepReadonly', () => {
|
describe('should support DeepReadonly', () => {
|
||||||
const r = readonly({ obj: { k: 'v' } })
|
const r = readonly({ obj: { k: 'v' } })
|
||||||
@ -15,6 +24,35 @@ describe('readonly ref', () => {
|
|||||||
expectType<Ref>(r)
|
expectType<Ref>(r)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('should support markRaw', () => {
|
||||||
|
class Test<T> {
|
||||||
|
item = {} as Ref<T>
|
||||||
|
}
|
||||||
|
const test = new Test<number>()
|
||||||
|
const plain = {
|
||||||
|
ref: ref(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const r = reactive({
|
||||||
|
class: {
|
||||||
|
raw: markRaw(test),
|
||||||
|
reactive: test
|
||||||
|
},
|
||||||
|
plain: {
|
||||||
|
raw: markRaw(plain),
|
||||||
|
reactive: plain
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
expectType<Test<number>>(r.class.raw)
|
||||||
|
// @ts-expect-error it should unwrap
|
||||||
|
expectType<Test<number>>(r.class.reactive)
|
||||||
|
|
||||||
|
expectType<Ref<number>>(r.plain.raw.ref)
|
||||||
|
// @ts-expect-error it should unwrap
|
||||||
|
expectType<Ref<number>>(r.plain.reactive.ref)
|
||||||
|
})
|
||||||
|
|
||||||
describe('shallowReadonly ref unwrap', () => {
|
describe('shallowReadonly ref unwrap', () => {
|
||||||
const r = shallowReadonly({ count: { n: ref(1) } })
|
const r = shallowReadonly({ count: { n: ref(1) } })
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
|
Loading…
Reference in New Issue
Block a user