File tree 3 files changed +41
-3
lines changed
3 files changed +41
-3
lines changed Original file line number Diff line number Diff line change @@ -269,6 +269,18 @@ describe('reactivity/ref', () => {
269
269
expect ( toRef ( r , 'x' ) ) . toBe ( r . x )
270
270
} )
271
271
272
+ test ( 'toRef default value' , ( ) => {
273
+ const a : { x : number | undefined } = { x : undefined }
274
+ const x = toRef ( a , 'x' , 1 )
275
+ expect ( x . value ) . toBe ( 1 )
276
+
277
+ a . x = 2
278
+ expect ( x . value ) . toBe ( 2 )
279
+
280
+ a . x = undefined
281
+ expect ( x . value ) . toBe ( 1 )
282
+ } )
283
+
272
284
test ( 'toRefs' , ( ) => {
273
285
const a = reactive ( {
274
286
x : 1 ,
Original file line number Diff line number Diff line change @@ -206,10 +206,15 @@ export function toRefs<T extends object>(object: T): ToRefs<T> {
206
206
class ObjectRefImpl < T extends object , K extends keyof T > {
207
207
public readonly __v_isRef = true
208
208
209
- constructor ( private readonly _object : T , private readonly _key : K ) { }
209
+ constructor (
210
+ private readonly _object : T ,
211
+ private readonly _key : K ,
212
+ private readonly _defaultValue ?: T [ K ]
213
+ ) { }
210
214
211
215
get value ( ) {
212
- return this . _object [ this . _key ]
216
+ const val = this . _object [ this . _key ]
217
+ return val === undefined ? ( this . _defaultValue as T [ K ] ) : val
213
218
}
214
219
215
220
set value ( newVal ) {
@@ -222,9 +227,23 @@ export type ToRef<T> = [T] extends [Ref] ? T : Ref<T>
222
227
export function toRef < T extends object , K extends keyof T > (
223
228
object : T ,
224
229
key : K
230
+ ) : ToRef < T [ K ] >
231
+
232
+ export function toRef < T extends object , K extends keyof T > (
233
+ object : T ,
234
+ key : K ,
235
+ defaultValue : T [ K ]
236
+ ) : ToRef < Exclude < T [ K ] , undefined > >
237
+
238
+ export function toRef < T extends object , K extends keyof T > (
239
+ object : T ,
240
+ key : K ,
241
+ defaultValue ?: T [ K ]
225
242
) : ToRef < T [ K ] > {
226
243
const val = object [ key ]
227
- return isRef ( val ) ? val : ( new ObjectRefImpl ( object , key ) as any )
244
+ return isRef ( val )
245
+ ? val
246
+ : ( new ObjectRefImpl ( object , key , defaultValue ) as any )
228
247
}
229
248
230
249
// corner case when use narrows type
Original file line number Diff line number Diff line change @@ -224,6 +224,13 @@ expectType<Ref<string>>(p2.obj.k)
224
224
expectType < Ref < number > > ( toRefsResult . a . value . b )
225
225
}
226
226
227
+ // toRef default value
228
+ {
229
+ const obj : { x ?: number } = { }
230
+ const x = toRef ( obj , 'x' , 1 )
231
+ expectType < Ref < number > > ( x )
232
+ }
233
+
227
234
// #2687
228
235
interface AppData {
229
236
state : 'state1' | 'state2' | 'state3'
You can’t perform that action at this time.
0 commit comments