From 3754591257c3320b179f1128121fc5aac43df3df Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Sat, 15 Apr 2023 11:03:09 +0100 Subject: [PATCH] fix(nuxt): return type directly if not picking asyncData (#20288) --- packages/nuxt/src/app/composables/asyncData.ts | 6 ++++-- test/fixtures/basic/types.ts | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/nuxt/src/app/composables/asyncData.ts b/packages/nuxt/src/app/composables/asyncData.ts index 31f8fd32da..d4ac4e49ec 100644 --- a/packages/nuxt/src/app/composables/asyncData.ts +++ b/packages/nuxt/src/app/composables/asyncData.ts @@ -11,14 +11,16 @@ export type PickFrom> = T extends Array : T extends Record ? keyof T extends K[number] ? T // Exact same keys as the target, skip Pick - : Pick + : K[number] extends never + ? T + : Pick : T export type KeysOf = Array< T extends T // Include all keys of union types, not just common keys ? keyof T extends string ? keyof T - : string + : never : never > diff --git a/test/fixtures/basic/types.ts b/test/fixtures/basic/types.ts index 85e7f27089..61eb67d5b4 100644 --- a/test/fixtures/basic/types.ts +++ b/test/fixtures/basic/types.ts @@ -259,6 +259,21 @@ describe('composables', () => { expectTypeOf(useFetch('/api/hey', { default: () => 'bar', transform: v => v.foo }).data).toEqualTypeOf>() expectTypeOf(useLazyFetch('/api/hey', { default: () => 'bar', transform: v => v.foo }).data).toEqualTypeOf>() }) + + it('correctly types returns with key signatures', () => { + interface TestType { + id: string + content: string[] + [x: string]: any + } + + const testFetch = () => Promise.resolve({}) as Promise + + const { data: notTypedData } = useAsyncData('test', testFetch) + expectTypeOf(notTypedData.value!.id).toEqualTypeOf() + expectTypeOf(notTypedData.value!.content).toEqualTypeOf() + expectTypeOf(notTypedData.value!.untypedKey).toEqualTypeOf() + }) }) describe('app config', () => {