Typescript compilation is taking a long time to run, so I used generateTrace
from https://github.com/microsoft/TypeScript/pull/40063
It showed that most of the time was comparing complicated classes with their subclasses. E.g. one of the classes is the base Objection model (https://github.com/vincit/objection.js), which is the base class that all my models inherit.
E.g. I have code like:
class User extends Model {}
function doSomething(model: typeof Model) {}
doSomething(User);
I have ~50 models. I think the first time TS encounters each model is slow, then it caches it. It takes about 5s for TS to compare a specific model with the base Model
. Model
uses types from several libraries. Here's a screenshot of the trace, it takes 5min just to compare each model with Model
:
Is there a way to get TS to skip comparing Model
with itself? I.e. since User
extends Model
, there's no need to check the fields it inherited.
Edit:
I reduced the time to check the 50 models from 5min to 30s. I have a map of models:
type ModelType = 'user' | ...
type ModelsMap = {
user: User,
...
};
getModel<T extends ModelType>(type: T): ModelsMap[T] {}
This is slow because ModelsMap[T]
is a union of all the models. It became faster if I return the base model when T
is an union of all the model types:
type TypeToModel<T extends ModelType> = ModelType extends T ? Model : ModelsMap[T];
getModel<T extends ModelType>(type: T): TypeToModel<T> {}
However, it would still be nice to know if there are hacks to make comparing subclass faster. E.g. if it's possible to disable structural typing and use nominal for subclasses.
generateTrace
has instructions here: github.com/microsoft/TypeScript/pull/… The trace shows that each comparison between the base model class and a subclass takes a few seconds. – Reginaldreginauld