Hermanya/create-react-hook

Typescript build fails with generic types

totalolage opened this issue · 0 comments

Edit: this is solved by updating the packates (using ncu -u in my case)

Running the rollup build fails on the typescript plugin step, complaining about a recursive definition.

src/index.ts → dist/index.js, dist/index.es.js...
[!] (plugin typescript) Error: @rollup/plugin-typescript TS2456: Type alias 'UpTo' circularly references itself.
src/index.ts (34:6)

34 type UpTo<T extends readonly any[], K extends T[number]> = K extends First<T> ? K : (K | UpTo<T, Previous<T, K>>);
        ~~~~

Error: @rollup/plugin-typescript TS2456: Type alias 'UpTo' circularly references itself.
    at error (use-date-countdown/node_modules/rollup/dist/shared/rollup.js:5279:30)
    at throwPluginError (use-date-countdown/node_modules/rollup/dist/shared/rollup.js:18240:12)
    at Object.error (use-date-countdown/node_modules/rollup/dist/shared/rollup.js:18847:24)
    at emitDiagnostic (use-date-countdown/node_modules/@rollup/plugin-typescript/dist/index.js:415:17)
    at reportDiagnostics (use-date-countdown/node_modules/@rollup/plugin-typescript/dist/index.js:423:9)
    at Array.forEach (<anonymous>)
    at emitFilesAndReportErrors (use-date-countdown/node_modules/typescript/lib/typescript.js:105333:21)
    at Object.result.afterProgramCreate (use-date-countdown/node_modules/typescript/lib/typescript.js:105503:13)
    at Object.afterProgramCreate (use-date-countdown/node_modules/@rollup/plugin-typescript/dist/index.js:515:29)
    at synchronizeProgram (use-date-countdown/node_modules/typescript/lib/typescript.js:105767:22)

Compiling purely with typescript tsc goes through without error. The UpTo type is recursive but not infinite:

type Pop<A extends readonly any[]> = ((...all: A) => void) extends ((popped: any, ...rest: infer R) => void) ? R : [];
type Push<I, R extends readonly any[]> = ((item: I, ...rest: R) => void) extends ((...all: infer A) => void) ? A : unknown;
type Rev<A extends readonly any[], P extends readonly any[] = []> = 0 extends A["length"] ? P : Rev<Pop<A>, Push<A[0], P>>;
type Next<A extends readonly any[], I extends A[number]> = 0 extends A["length"] ? never : 1 extends A["length"] ? never : I extends A[0] ? A[1] : Next<Pop<A>, I>;
type Previous<A extends readonly any[], I extends A[number]> = Next<Rev<A>, I>;
type UpTo<A extends readonly any[], I extends A[number]> = I extends A[0] ? I : (I | UpTo<A, Previous<A, I>>);