Navigation Menu

Skip to content

Commit

Permalink
fix(types): should unwrap array -> object -> ref
Browse files Browse the repository at this point in the history
  • Loading branch information
yyx990803 committed Jun 29, 2020
1 parent 028a8c2 commit 82b28a5
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 3 deletions.
2 changes: 1 addition & 1 deletion .eslintrc.js
Expand Up @@ -26,7 +26,7 @@ module.exports = {
overrides: [
// tests, no restrictions (runs in Node / jest with jsdom)
{
files: ['**/__tests__/**'],
files: ['**/__tests__/**', 'test-dts/**'],
rules: {
'no-restricted-globals': 'off',
'no-restricted-syntax': 'off'
Expand Down
5 changes: 3 additions & 2 deletions packages/reactivity/src/ref.ts
Expand Up @@ -165,10 +165,11 @@ type UnwrapRefSimple<T> = T extends
| CollectionTypes
| BaseTypes
| Ref
| Array<any>
| RefUnwrapBailTypes[keyof RefUnwrapBailTypes]
? T
: T extends object ? UnwrappedObject<T> : T
: T extends Array<any>
? { [K in keyof T]: T[K] extends Ref ? T[K] : UnwrapRefSimple<T[K]> }
: T extends object ? UnwrappedObject<T> : T

// Extract all known symbols from an object
// when unwrapping Object the symbols are not `in keyof`, this should cover all the
Expand Down
17 changes: 17 additions & 0 deletions test-dts/ref.test-d.ts
Expand Up @@ -41,6 +41,23 @@ function plainType(arg: number | Ref<number>) {
expectType<Ref<IteratorFoo | null | undefined>>(
ref<IteratorFoo | null | undefined>()
)

// should not unwrap ref inside arrays
const arr = ref([1, new Map<string, any>(), ref('1')]).value
const value = arr[0]
if (isRef(value)) {
expectType<Ref>(value)
} else if (typeof value === 'number') {
expectType<number>(value)
} else {
// should narrow down to Map type
// and not contain any Ref type
expectType<Map<string, any>>(value)
}

// should still unwrap in objects nested in arrays
const arr2 = ref([{ a: ref(1) }]).value
expectType<number>(arr2[0].a)
}

plainType(1)
Expand Down

0 comments on commit 82b28a5

Please sign in to comment.