@@ -23,7 +23,7 @@ const convert = <T extends unknown>(val: T): T =>
2323
2424export function isRef < T > ( r : Ref < T > | unknown ) : r is Ref < T >
2525export function isRef ( r : any ) : r is Ref {
26- return r ? r . __v_isRef === true : false
26+ return Boolean ( r && r . __v_isRef === true )
2727}
2828
2929export function ref < T extends object > (
@@ -44,26 +44,34 @@ export function shallowRef(value?: unknown) {
4444 return createRef ( value , true )
4545}
4646
47+ class RefImpl < T > {
48+ private _value : T
49+
50+ public readonly __v_isRef = true
51+
52+ constructor ( private _rawValue : T , private readonly _shallow = false ) {
53+ this . _value = _shallow ? _rawValue : convert ( _rawValue )
54+ }
55+
56+ get value ( ) {
57+ track ( toRaw ( this ) , TrackOpTypes . GET , 'value' )
58+ return this . _value
59+ }
60+
61+ set value ( newVal ) {
62+ if ( hasChanged ( toRaw ( newVal ) , this . _rawValue ) ) {
63+ this . _rawValue = newVal
64+ this . _value = this . _shallow ? newVal : convert ( newVal )
65+ trigger ( toRaw ( this ) , TriggerOpTypes . SET , 'value' , newVal )
66+ }
67+ }
68+ }
69+
4770function createRef ( rawValue : unknown , shallow = false ) {
4871 if ( isRef ( rawValue ) ) {
4972 return rawValue
5073 }
51- let value = shallow ? rawValue : convert ( rawValue )
52- const r = {
53- __v_isRef : true ,
54- get value ( ) {
55- track ( r , TrackOpTypes . GET , 'value' )
56- return value
57- } ,
58- set value ( newVal ) {
59- if ( hasChanged ( toRaw ( newVal ) , rawValue ) ) {
60- rawValue = newVal
61- value = shallow ? newVal : convert ( newVal )
62- trigger ( r , TriggerOpTypes . SET , 'value' , newVal )
63- }
64- }
65- }
66- return r
74+ return new RefImpl ( rawValue , shallow )
6775}
6876
6977export function triggerRef ( ref : Ref ) {
@@ -103,21 +111,32 @@ export type CustomRefFactory<T> = (
103111 set : ( value : T ) => void
104112}
105113
106- export function customRef < T > ( factory : CustomRefFactory < T > ) : Ref < T > {
107- const { get, set } = factory (
108- ( ) => track ( r , TrackOpTypes . GET , 'value' ) ,
109- ( ) => trigger ( r , TriggerOpTypes . SET , 'value' )
110- )
111- const r = {
112- __v_isRef : true ,
113- get value ( ) {
114- return get ( )
115- } ,
116- set value ( v ) {
117- set ( v )
118- }
114+ class CustomRefImpl < T > {
115+ private readonly _get : ReturnType < CustomRefFactory < T > > [ 'get' ]
116+ private readonly _set : ReturnType < CustomRefFactory < T > > [ 'set' ]
117+
118+ public readonly __v_isRef = true
119+
120+ constructor ( factory : CustomRefFactory < T > ) {
121+ const { get, set } = factory (
122+ ( ) => track ( this , TrackOpTypes . GET , 'value' ) ,
123+ ( ) => trigger ( this , TriggerOpTypes . SET , 'value' )
124+ )
125+ this . _get = get
126+ this . _set = set
127+ }
128+
129+ get value ( ) {
130+ return this . _get ( )
131+ }
132+
133+ set value ( newVal ) {
134+ this . _set ( newVal )
119135 }
120- return r as any
136+ }
137+
138+ export function customRef < T > ( factory : CustomRefFactory < T > ) : Ref < T > {
139+ return new CustomRefImpl ( factory ) as any
121140}
122141
123142export function toRefs < T extends object > ( object : T ) : ToRefs < T > {
@@ -131,19 +150,25 @@ export function toRefs<T extends object>(object: T): ToRefs<T> {
131150 return ret
132151}
133152
153+ class ObjectRefImpl < T extends object , K extends keyof T > {
154+ public readonly __v_isRef = true
155+
156+ constructor ( private readonly _object : T , private readonly _key : K ) { }
157+
158+ get value ( ) {
159+ return this . _object [ this . _key ]
160+ }
161+
162+ set value ( newVal ) {
163+ this . _object [ this . _key ] = newVal
164+ }
165+ }
166+
134167export function toRef < T extends object , K extends keyof T > (
135168 object : T ,
136169 key : K
137170) : Ref < T [ K ] > {
138- return {
139- __v_isRef : true ,
140- get value ( ) : any {
141- return object [ key ]
142- } ,
143- set value ( newVal ) {
144- object [ key ] = newVal
145- }
146- } as any
171+ return new ObjectRefImpl ( object , key ) as any
147172}
148173
149174// corner case when use narrows type
0 commit comments