Skip to content

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

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.tsexportconstpower=<Numextendsnumber,PowerOfextendsnumber>(num: Num,powerOf: PowerOf,): Power<Num,PowerOf>=>(num**powerOf)asnever
// Number.d.tsexportdeclareconstpower: <Numextendsnumber,PowerOfextendsnumber>(num: Num,powerOf: PowerOf)=>numberextendsPowerOf ? PowerOf&number : PowerOfextends0 ? 1 : numberextendsSubtract<PowerOf,1> ? Subtract<PowerOf,1>&number : Subtract<PowerOf,1>extends infer T ? TextendsSubtract<PowerOf,1> ? Textends0 ? Multiply<1,Num> : numberextendsSubtract<T,1> ? Subtract<T,1>&number : Subtract<T,1>extends infer T_1 ? T_1extendsSubtract<T,1> ? T_1extends0 ? Multiply<Multiply<1,Num>,Num> : numberextendsSubtract<T_1,1> ? Subtract<T_1,1>&number : Subtract<T_1,1>extends infer T_2 ? T_2extendsSubtract<T_1,1> ? T_2extends0 ? Multiply<Multiply<Multiply<1,Num>,Num>,Num> : numberextendsSubtract<T_2,1> ? Subtract<T_2,1>&number : Subtract<T_2,1>extends infer T_3 ? T_3extendsSubtract<T_2,1> ? T_3extends0 ? Multiply<Multiply<Multiply<Multiply<1,Num>,Num>,Num>,Num> : numberextendsSubtract<T_3,1> ? Subtract<T_3,1>&number : Subtract<T_3,1>extends infer T_4 ? T_4extendsSubtract<T_3,1> ? T_4extends0 ? Multiply<Multiply<Multiply<Multiply<Multiply<1,Num>,Num>,Num>,Num>,Num> : numberextendsSubtract<T_4,1> ? Subtract<T_4,1>&number : Subtract<T_4,1>extends infer T_5 ? T_5extendsSubtract<T_4,1> ? T_5extends0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1,Num>,Num>,Num>,Num>,Num>,Num> : numberextendsSubtract<T_5,1> ? Subtract<T_5,1>&number : Subtract<T_5,1>extends infer T_6 ? T_6extendsSubtract<T_5,1> ? T_6extends0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1,Num>,Num>,Num>,Num>,Num>,Num>,Num> : numberextendsSubtract<T_6,1> ? Subtract<T_6,1>&number : Subtract<T_6,1>extends infer T_7 ? T_7extendsSubtract<T_6,1> ? T_7extends0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1,Num>,Num>,Num>,Num>,Num>,Num>,Num>,Num> : numberextendsSubtract<T_7,1> ? Subtract<T_7,1>&number : Subtract<T_7,1>extends infer T_8 ? T_8extendsSubtract<T_7,1> ? T_8extends0 ? Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<Multiply<1,Num>,Num>,Num>,Num>,Num>,Num>,Num>,Num>,Num> : numberextendsSubtract<T_8,1> ? Subtract<T_8,1>&number : Subtract<T_8,1>extends infer T_9 ? T_9extendsSubtract<T_8,1> ? T_9extends0 ? 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.tsexportdeclareconstpower: <Numextendsnumber,PowerOfextendsnumber>(num: Num,powerOf: PowerOf,)=>Power<Num,PowerOf>

Metadata

Metadata

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