apollo icon indicating copy to clipboard operation
apollo copied to clipboard

Type Inference breaks with `bundler` resolution

Open nuraeil opened this issue 1 year ago • 2 comments

Environment

Describe the bug

With the switch in Nuxt version 3.10 to defaulting to the bundler resolution, this plugins type inference fully breaks. When using strict, the build process stops and throws the following error:

components/Bet/Moderation/AddRaceEntry.vue:508:18 - error TS7031: Binding element 'id' implicitly has an 'any' type.

This is what is displayed in VS Code when hovering over the variable for the destructured data.

image

Expected behaviour

When turning bundler resolution off, everything builds and type inference works.

nuxt.config.ts

future: {
  typescriptBundlerResolution: false,
},
image

Reproduction

https://stackblitz.com/edit/github-ohfhqq

Additional context

No response

Logs

No response

nuraeil avatar Feb 09 '24 10:02 nuraeil

CC: @danielroe

nuraeil avatar Feb 09 '24 10:02 nuraeil

I've been stuck on trying to figure out why it does work for useQuery() but not for useLazyAsyncQuery() / useAsyncQuery() all morning, glad I came across your post!

I didnt figure out it was due to the bundler and made a quick wrapper to keep TS-support for now;

composables/useTypedLazyAsyncQuery.ts;

import type { DocumentNode } from "graphql";

export function useTypedLazyAsyncQuery<T>(
    query: DocumentNode
): Ref<T | undefined> {
    const { data } = await useLazyAsyncQuery<T>(query);
    return computed(() => data.value as T);
}

usage:

import type { GetShopsPreviewResult } from "~/types/generated/index"

import { GET_SHOPS_PREVIEW } from '~/graphql/queries/shops/getShopsPreview';
import { useTypedLazyAsyncQuery } from '@/composables/useTypedLazyAsyncQuery';

const data = await useTypedLazyAsyncQuery<GetShopsPreviewResult>(GET_SHOPS_PREVIEW);

GreenmeisterDavid avatar Feb 09 '24 11:02 GreenmeisterDavid