Typescript 编译运行需要很长时间,所以我使用了 generateTrace
来自 https://github.com/microsoft/TypeScript/pull/40063
它表明大部分时间都在将复杂的类与其子类进行比较。例如。其中一个类是基 Objection 模型 (https://github.com/vincit/objection.js),它是我所有模型都继承的基类。
例如。我有如下代码:
class User extends Model {}
function doSomething(model: typeof Model) {}
doSomething(User);
我有大约 50 个模型。我认为TS第一次遇到每个模型都很慢,然后它会缓存它。 TS 将特定模型与基础 Model
进行比较大约需要 5s . Model
使用来自多个库的类型。这是跟踪的屏幕截图,只需将每个模型与 Model
进行比较就需要 5 分钟:有没有办法让 TS 跳过比较
Model
与自己? IE。自从 User
扩展 Model
,不需要检查它继承的字段。编辑:
我将检查 50 个模型的时间从 5 分钟缩短到 30 秒。我有一张模型图:
type ModelType = 'user' | ...
type ModelsMap = {
user: User,
...
};
getModel<T extends ModelType>(type: T): ModelsMap[T] {}
这很慢,因为 ModelsMap[T]
是所有模型的联合。如果我在 T
时返回基本模型,它会变得更快。是所有模型类型的联合:type TypeToModel<T extends ModelType> = ModelType extends T ? Model : ModelsMap[T];
getModel<T extends ModelType>(type: T): TypeToModel<T> {}
但是,很高兴知道是否有技巧可以更快地比较子类。例如。如果可以禁用结构类型并为子类使用名义。
最佳答案
我不确定这对您的情况是否有帮助,但您可以通过允许 incremental
显着加快该过程。标记您的tsc
命令:
// package.json
"tsc": "tsc -v && tsc --noEmit --skipLibCheck --incremental",
这将创建一个
tsconfig.tsbuildinfo
文件,这实际上是您的代码库的图表。然后,Typescript 将仅比较您更改的条目。第一次编译会很慢,因为它会生成图形,但之后编译时间至少会减少 3 倍。
关于javascript - 防止 Typescript 编译器检查整个类以节省时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70459685/