Skip to content

some types compile to a massive conditional type that causes performance issues #51106

Closed
@DetachHead

Description

@DetachHead

Bug Report

sorry i tried to create a minimal repro but this is the best i could do, so to reproduce this, run npm install @detachhead/ts-helpers

🔎 Search Terms

d.ts performance

🕗 Version & Regression Information

4.9.0-dev.20221007

💻 Code

takes like 2 minutes to compile:

import { power } from '@detachhead/ts-helpers/dist/utilityFunctions/Number'
power

takes a couple seconds to compile:

import { power } from '@detachhead/ts-helpers/src/utilityFunctions/Number'
power

🙁 Actual behavior

the power function is being compiled to return this huge conditional type that causes the compiler to hang for several minutes when it's imported:

// Number.ts
export const power = <Num extends number, PowerOf extends number>(
    num: Num,
    powerOf: PowerOf,
): Power<Num, PowerOf> => (num ** powerOf) as never
// Number.d.ts
export declare const power: <Num extends number, PowerOf extends number>(num: Num, powerOf: PowerOf) => number extends PowerOf ? PowerOf & number : PowerOf extends 0 ? 1 : number extends Subtract<PowerOf, 1> ? Subtract<PowerOf, 1> & number : Subtract<PowerOf, 1> extends infer T ? T extends Subtract<PowerOf, 1> ? T extends 0 ? Multiply<1, Num> : number extends Subtract<T, 1> ? Subtract<T, 1> & number : Subtract<T, 1> extends infer T_1 ? T_1 extends Subtract<T, 1> ? T_1 extends 0 ? Multiply<Multiply<1, Num>, Num> : number extends Subtract<T_1, 1> ? Subtract<T_1, 1> & number : Subtract<T_1, 1> extends infer T_2 ? T_2 extends Subtract<T_1, 1> ? T_2 extends 0 ? Multiply<Multiply<Multiply<1, Num>, Num>, Num> : number extends Subtract<T_2, 1> ? Subtract<T_2, 1> & number : Subtract<T_2, 1> extends infer T_3 ? T_3 extends Subtract<T_2, 1> ? T_3 extends 0 ? Multiply<Multiply<Multiply<Multiply<1, Num>, Num>, Num>, Num> : number extends Subtract<T_3, 1> ? Subtract<T_3, 1> & number : Subtract<T_3, 1> extends infer T_4 ? T_4 extends Subtract<T_3, 1> ? T_4 extends 0 ? Multiply<Multiply<Multiply<Multiply<Multiply<1, Num>, Num>, Num>, Num>, Num> : number extends Subtract<T_4, 1> ? Subtract<T_4, 1> & number : Subtract<T_4, 1> extends infer T_5 ? T_5 extends Subtract<T_4, 1> ? T_5 extends 0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1, Num>, Num>, Num>, Num>, Num>, Num> : number extends Subtract<T_5, 1> ? Subtract<T_5, 1> & number : Subtract<T_5, 1> extends infer T_6 ? T_6 extends Subtract<T_5, 1> ? T_6 extends 0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1, Num>, Num>, Num>, Num>, Num>, Num>, Num> : number extends Subtract<T_6, 1> ? Subtract<T_6, 1> & number : Subtract<T_6, 1> extends infer T_7 ? T_7 extends Subtract<T_6, 1> ? T_7 extends 0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1, Num>, Num>, Num>, Num>, Num>, Num>, Num>, Num> : number extends Subtract<T_7, 1> ? Subtract<T_7, 1> & number : Subtract<T_7, 1> extends infer T_8 ? T_8 extends Subtract<T_7, 1> ? T_8 extends 0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1, Num>, Num>, Num>, Num>, Num>, Num>, Num>, Num>, Num> : number extends Subtract<T_8, 1> ? Subtract<T_8, 1> & number : Subtract<T_8, 1> extends infer T_9 ? T_9 extends Subtract<T_8, 1> ? T_9 extends 0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1, Num>, Num>, Num>, Num>, Num>, Num>, Num>, Num>, Num>, Num> : any : never : never : never : never : never : never : never : never : never : never : never : never : never : never : never : never : never : never : never : never;

🙂 Expected behavior

// Number.d.ts
export declare const power: <Num extends number, PowerOf extends number>(
    num: Num,
    powerOf: PowerOf,
) => Power<Num, PowerOf>

Metadata

Metadata

Assignees

Labels

Fix AvailableA PR has been opened for this issueNeeds InvestigationThis issue needs a team member to investigate its status.

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions