@@ -23,7 +23,7 @@ const convert = <T extends unknown>(val: T): T =>
23
23
24
24
export function isRef < T > ( r : Ref < T > | unknown ) : r is Ref < T >
25
25
export function isRef ( r : any ) : r is Ref {
26
- return r ? r . __v_isRef === true : false
26
+ return Boolean ( r && r . __v_isRef === true )
27
27
}
28
28
29
29
export function ref < T extends object > (
@@ -44,26 +44,34 @@ export function shallowRef(value?: unknown) {
44
44
return createRef ( value , true )
45
45
}
46
46
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
+
47
70
function createRef ( rawValue : unknown , shallow = false ) {
48
71
if ( isRef ( rawValue ) ) {
49
72
return rawValue
50
73
}
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 )
67
75
}
68
76
69
77
export function triggerRef ( ref : Ref ) {
@@ -103,21 +111,32 @@ export type CustomRefFactory<T> = (
103
111
set : ( value : T ) => void
104
112
}
105
113
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 )
119
135
}
120
- return r as any
136
+ }
137
+
138
+ export function customRef < T > ( factory : CustomRefFactory < T > ) : Ref < T > {
139
+ return new CustomRefImpl ( factory ) as any
121
140
}
122
141
123
142
export function toRefs < T extends object > ( object : T ) : ToRefs < T > {
@@ -131,19 +150,25 @@ export function toRefs<T extends object>(object: T): ToRefs<T> {
131
150
return ret
132
151
}
133
152
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
+
134
167
export function toRef < T extends object , K extends keyof T > (
135
168
object : T ,
136
169
key : K
137
170
) : 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
147
172
}
148
173
149
174
// corner case when use narrows type
0 commit comments