Skip to content

Commit f6a5f09

Browse files
authored
types(defineComponent): fix unwrap when returning Ref<T>|undefined from setup (#4100)
1 parent e508ee0 commit f6a5f09

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

packages/reactivity/src/ref.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,11 @@ type BaseTypes = string | number | boolean
205205
export interface RefUnwrapBailTypes {}
206206

207207
export type ShallowUnwrapRef<T> = {
208-
[K in keyof T]: T[K] extends Ref<infer V> ? V : T[K]
208+
[K in keyof T]: T[K] extends Ref<infer V>
209+
? V
210+
: T[K] extends Ref<infer V> | undefined // if `V` is `unknown` that means it does not extend `Ref` and is undefined
211+
? unknown extends V ? undefined : V | undefined
212+
: T[K]
209213
}
210214

211215
export type UnwrapRef<T> = T extends Ref<infer V>

test-dts/component.test-d.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ describe('object props', () => {
159159
setupC: {
160160
a: ref(2)
161161
},
162+
setupD: undefined as Ref<number> | undefined,
162163
setupProps: props
163164
}
164165
}
@@ -190,7 +191,7 @@ describe('object props', () => {
190191
expectType<Number>(rawBindings.setupA)
191192
expectType<Ref<Number>>(rawBindings.setupB)
192193
expectType<Ref<Number>>(rawBindings.setupC.a)
193-
expectType<Number>(rawBindings.setupA)
194+
expectType<Ref<Number> | undefined>(rawBindings.setupD)
194195

195196
// raw bindings props
196197
expectType<ExpectedProps['a']>(rawBindings.setupProps.a)
@@ -215,7 +216,7 @@ describe('object props', () => {
215216
expectType<Number>(setup.setupA)
216217
expectType<Number>(setup.setupB)
217218
expectType<Ref<Number>>(setup.setupC.a)
218-
expectType<Number>(setup.setupA)
219+
expectType<number | undefined>(setup.setupD)
219220

220221
// raw bindings props
221222
expectType<ExpectedProps['a']>(setup.setupProps.a)
@@ -239,6 +240,7 @@ describe('object props', () => {
239240
// instance
240241
const instance = new MyComponent()
241242
expectType<number>(instance.setupA)
243+
expectType<number | undefined>(instance.setupD)
242244
// @ts-expect-error
243245
instance.notExist
244246
})

0 commit comments

Comments
 (0)