Skip to content

Declarations can't be emitted when types from inner modules are exported through separate export declarations #56856

Description

🔎 Search Terms

declarations portable emit modules export declaration alias aliasing

🕗 Version & Regression Information

  • This is the behavior in every version I tried

⏯ Playground Link

N/A

💻 Code

// @strict: true// @declaration: true// @module: nodenext// @moduleResolution: nodenext// @target: esnext// @filename: node_modules/@tanstack/vue-query/build/modern/useQuery-CPqkvEsh.d.tstypeQueryKey=ReadonlyArray<unknown>;interfaceRegister{}typeDefaultError=Registerextends{defaultError: infer TError;}
? TError
: Error;typeShouldRetryFunction<TError=DefaultError>=(failureCount: number,error: TError,)=>boolean;typeRetryValue<TError>=boolean|number|ShouldRetryFunction<TError>;typeQueryFunctionContext<TQueryKeyextendsQueryKey=QueryKey,TPageParam=never,>=[TPageParam]extends[never]
? {queryKey: TQueryKey;}
: {queryKey: TQueryKey;pageParam: TPageParam;};typeQueryFunction<T=unknown,TQueryKeyextendsQueryKey=QueryKey,TPageParam=never,>=(context: QueryFunctionContext<TQueryKey,TPageParam>)=>T|Promise<T>;interfaceQueryOptions<TQueryFnData=unknown,TError=DefaultError,TData=TQueryFnData,TQueryKeyextendsQueryKey=QueryKey,TPageParam=never,>{retry?: RetryValue<TError>;queryFn?: QueryFunction<TQueryFnData,TQueryKey,TPageParam>;queryKey?: TQueryKey;initialData?: TData;initialDataUpdatedAt?: number|(()=>number|undefined);}interfaceQueryObserverOptions<TQueryFnData=unknown,TError=DefaultError,TData=TQueryFnData,TQueryData=TQueryFnData,TQueryKeyextendsQueryKey=QueryKey,TPageParam=never,>extendsQueryOptions<TQueryFnData,TError,TQueryData,TQueryKey,TPageParam>{enabled?: boolean;refetchInterval?: number;select?: (data: TQueryData)=>TData;}typeUseQueryOptions<TQueryFnData=unknown,TError=DefaultError,TData=TQueryFnData,TQueryData=TQueryFnData,TQueryKeyextendsQueryKey=QueryKey,>={[PropertyinkeyofQueryObserverOptions<TQueryFnData,TError,TData,TQueryData,TQueryKey>]: QueryObserverOptions<TQueryFnData,TError,TData,TQueryData,TQueryKey>[Property];};typeUndefinedInitialQueryOptions<TQueryFnData=unknown,TError=DefaultError,TData=TQueryFnData,TQueryKeyextendsQueryKey=QueryKey,>=UseQueryOptions<TQueryFnData,TError,TData,TQueryFnData,TQueryKey>&{initialData?: undefined;};interfaceQueryObserverBaseResult<TData=unknown,TError=DefaultError>{data: TData|undefined;dataUpdatedAt: number;error: TError|null;errorUpdatedAt: number;failureCount: number;failureReason: TError|null;errorUpdateCount: number;isError: boolean;isFetched: boolean;isFetchedAfterMount: boolean;isFetching: boolean;isLoading: boolean;isPending: boolean;isLoadingError: boolean;isInitialLoading: boolean;isPaused: boolean;isPlaceholderData: boolean;isRefetchError: boolean;isRefetching: boolean;isStale: boolean;isSuccess: boolean;}interfaceQueryObserverSuccessResult<TData=unknown,TError=DefaultError>extendsQueryObserverBaseResult<TData,TError>{data: TData;error: null;isError: false;isPending: false;isLoadingError: false;isRefetchError: false;isSuccess: true;status: "success";}typeDefinedQueryObserverResult<TData=unknown,TError=DefaultError,>=QueryObserverSuccessResult<TData,TError>;typeQueryObserverResult<TData=unknown,TError=DefaultError,>=DefinedQueryObserverResult<TData,TError>;typeToRef<T>={value: T;};typeUseBaseQueryReturnType<TData,TError,Result=QueryObserverResult<TData,TError>,>={[KinkeyofResult]: Kextends|"fetchNextPage"|"fetchPreviousPage"|"refetch"
? Result[K]
: ToRef<Readonly<Result>[K]>;}&{suspense: ()=>Promise<Result>;};typeUseQueryReturnType<TData,TError>=UseBaseQueryReturnType<TData,TError>;declarefunctionuseQuery<TQueryFnData=unknown,TError=DefaultError,TData=TQueryFnData,TQueryKeyextendsQueryKey=QueryKey,>(options: UndefinedInitialQueryOptions<TQueryFnData,TError,TData,TQueryKey>,): UseQueryReturnType<TData,TError>;export{typeUseQueryReturnTypeasb,useQueryasu};// @filename: node_modules/@tanstack/vue-query/build/modern/index.d.tsexport{basUseQueryReturnType,uasuseQuery}from'./useQuery-CPqkvEsh.js';// @filename: node_modules/@tanstack/vue-query/package.json{"name": "@tanstack/vue-query","type": "module","exports": {".": {"import": {"types": "./build/modern/index.d.ts","default": "./build/modern/index.js"},"require": {"types": "./build/modern/index.d.cts","default": "./build/modern/index.cjs"}}}}// @filename: src/index.mtsimport{useQuery}from'@tanstack/vue-query'constbaseUrl='https://api.publicapis.org/'interfaceIEntry{API: stringDescription: stringAuth: stringHTTPS: booleanCors: stringLink: stringCategory: string}consttestApi={getEntries: (): Promise<IEntry[]>=>{returnfetch(baseUrl+'entries').then((res)=>res.json()).then((data)=>data.entries).catch((err)=>console.log(err))}}constentryKeys={all: ['entries']asconst,list: ()=>[...entryKeys.all,'list']asconst}exportconstuseEntries=()=>{returnuseQuery({queryKey: entryKeys.list(),queryFn: testApi.getEntries,select: (data)=>data.slice(0,10)})}

🙁 Actual behavior

The inferred type of 'useEntries' cannot be named without a reference to '../../node_modules/@tanstack/vue-query/build/modern/useQuery-d58edace'. This is likely not portable. A type annotation is necessary.ts(2742)

🙂 Expected behavior

A declaration like this should be emitted successfully:

interfaceIEntry{API: string;Description: string;Auth: string;HTTPS: boolean;Cors: string;Link: string;Category: string;}exportdeclareconstuseEntries: ()=>import("@tanstack/vue-query").UseQueryReturnType<IEntry[],Error>;export{};

Additional information about the issue

It originally has been reported here: TanStack/query#6318

Metadata

Metadata

Labels

Fix AvailableA PR has been opened for this issuePossible ImprovementThe current behavior isn't wrong, but it's possible to see that it might be better in some cases

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions