diff --git a/packages/qwik-city/runtime/src/server-functions.unit.ts b/packages/qwik-city/runtime/src/server-functions.unit.ts index 0132da3b27b..5e1ba0883eb 100644 --- a/packages/qwik-city/runtime/src/server-functions.unit.ts +++ b/packages/qwik-city/runtime/src/server-functions.unit.ts @@ -12,6 +12,15 @@ describe('types', () => { expectTypeOf(foo).returns.not.toMatchTypeOf<(meep: boolean) => Promise>(); }); + test('matching with args', () => () => { + const foo = () => server$((name: string) => 'hello ' + name); + + expectTypeOf(foo).not.toBeAny(); + expectTypeOf(foo).returns.toMatchTypeOf<(name: string) => Promise>(); + expectTypeOf(foo).returns.toMatchTypeOf<(sig: AbortSignal, name: string) => Promise>(); + expectTypeOf(foo).returns.not.toMatchTypeOf<(meep: boolean) => Promise>(); + }); + test('inferring', () => () => { const callIt = () => server$(function () { diff --git a/packages/qwik-city/runtime/src/types.ts b/packages/qwik-city/runtime/src/types.ts index 67e450cf27d..eebf538354d 100644 --- a/packages/qwik-city/runtime/src/types.ts +++ b/packages/qwik-city/runtime/src/types.ts @@ -796,5 +796,6 @@ export type ServerFunction = { * abort the fetch when fired. */ export type ServerQRL = QRL< - (...args: [abort: AbortSignal, ...Parameters] | Parameters) => ReturnType + | ((abort: AbortSignal, ...args: Parameters) => ReturnType) + | ((...args: Parameters) => ReturnType) >; diff --git a/packages/qwik/src/core/api.md b/packages/qwik/src/core/api.md index 6c3caefd91f..db1543460fb 100644 --- a/packages/qwik/src/core/api.md +++ b/packages/qwik/src/core/api.md @@ -609,21 +609,18 @@ export type PropsOf = COMP extends Component ? NonNullable> = TransformProps & ComponentBaseProps & ComponentChildren; -// Warning: (ae-forgotten-export) The symbol "BivariantQrlFn" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "QrlArgs" needs to be exported by the entry point index.d.ts -// Warning: (ae-forgotten-export) The symbol "QrlReturn" needs to be exported by the entry point index.d.ts -// // @public export type QRL = { __qwik_serializable__?: any; __brand__QRL__: TYPE; + (...args: TYPE extends (...args: infer ARGS) => any ? ARGS : never): Promise infer RETURN ? Awaited : never>; resolve(): Promise; resolved: undefined | TYPE; getCaptured(): unknown[] | null; getSymbol(): string; getHash(): string; dev: QRLDev | null; -} & BivariantQrlFn, QrlReturn>; +}; // @public export const qrl: (chunkOrFn: string | (() => Promise), symbol: string, lexicalScopeCapture?: any[], stackOffset?: number) => QRL; diff --git a/packages/qwik/src/core/qrl/qrl-class.ts b/packages/qwik/src/core/qrl/qrl-class.ts index 1bda78d17e5..8af140ec7a8 100644 --- a/packages/qwik/src/core/qrl/qrl-class.ts +++ b/packages/qwik/src/core/qrl/qrl-class.ts @@ -73,7 +73,7 @@ export const createQRL = ( const fn = invokeFn.call(this, tryGetInvokeContext()); const result = await fn(...args); return result; - } as QRLInternal; + } as any as QRLInternal; const setContainer = (el: Element | undefined) => { if (!_containerEl) { diff --git a/packages/qwik/src/core/qrl/qrl.public.ts b/packages/qwik/src/core/qrl/qrl.public.ts index 395b14fac9e..35256ead799 100644 --- a/packages/qwik/src/core/qrl/qrl.public.ts +++ b/packages/qwik/src/core/qrl/qrl.public.ts @@ -138,6 +138,16 @@ export type QRL = { __qwik_serializable__?: any; __brand__QRL__: TYPE; + /** + * Resolve the QRL of closure and invoke it. + * + * @param args - Closure arguments. + * @returns A promise of the return value of the closure. + */ + ( + ...args: TYPE extends (...args: infer ARGS) => any ? ARGS : never + ): Promise infer RETURN ? Awaited : never>; + /** Resolve the QRL and return the actual value. */ resolve(): Promise; /** The resolved value, once `resolve()` returns. */ @@ -147,18 +157,7 @@ export type QRL = { getSymbol(): string; getHash(): string; dev: QRLDev | null; -} & BivariantQrlFn, QrlReturn>; - -// https://stackoverflow.com/questions/52667959/what-is-the-purpose-of-bivariancehack-in-typescript-types/52668133#52668133 -type BivariantQrlFn = { - /** - * Resolve the QRL of closure and invoke it. - * - * @param args - Closure arguments. - * @returns A promise of the return value of the closure. - */ - bivarianceHack(...args: ARGS): Promise; -}['bivarianceHack']; +}; /** @public */ export type PropFnInterface = {