fix(types): should unwrap array -> object -> ref

This commit is contained in:
Evan You 2020-06-29 12:26:28 -04:00
parent 028a8c20df
commit 82b28a5ecb
3 changed files with 21 additions and 3 deletions

View File

@ -26,7 +26,7 @@ module.exports = {
overrides: [ overrides: [
// tests, no restrictions (runs in Node / jest with jsdom) // tests, no restrictions (runs in Node / jest with jsdom)
{ {
files: ['**/__tests__/**'], files: ['**/__tests__/**', 'test-dts/**'],
rules: { rules: {
'no-restricted-globals': 'off', 'no-restricted-globals': 'off',
'no-restricted-syntax': 'off' 'no-restricted-syntax': 'off'

View File

@ -165,10 +165,11 @@ type UnwrapRefSimple<T> = T extends
| CollectionTypes | CollectionTypes
| BaseTypes | BaseTypes
| Ref | Ref
| Array<any>
| RefUnwrapBailTypes[keyof RefUnwrapBailTypes] | RefUnwrapBailTypes[keyof RefUnwrapBailTypes]
? T ? 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 // Extract all known symbols from an object
// when unwrapping Object the symbols are not `in keyof`, this should cover all the // when unwrapping Object the symbols are not `in keyof`, this should cover all the

View File

@ -41,6 +41,23 @@ function plainType(arg: number | Ref<number>) {
expectType<Ref<IteratorFoo | null | undefined>>( expectType<Ref<IteratorFoo | null | undefined>>(
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) plainType(1)