阻止 Typescript 编译器检查整个类以节省时间?

Leo*_*ang 21 javascript node.js typescript tsconfig typescript-compiler-api

Typescript 编译需要很长时间才能运行,所以我使用generateTracehttps://github.com/microsoft/TypeScript/pull/40063

它表明大多数时间是将复杂的类与其子类进行比较。例如,其中一个类是基本 Objection 模型(https://github.com/vincit/objection.js),它是我所有模型继承的基类。

例如我有这样的代码:

class User extends Model {}

function doSomething(model: typeof Model) {}

doSomething(User);
Run Code Online (Sandbox Code Playgroud)

我有大约 50 个模型。我认为 TS 第一次遇到每个模型时很慢,然后它会缓存它。TS将特定模型与基础进行比较大约需要5s ModelModel使用多个库中的类型。这是跟踪的屏幕截图,仅将每个模型与 进行比较就需要 5 分钟Model

在此输入图像描述

有没有办法让 TS 跳过Model与自身的比较?即自从Userextends以来Model,不需要检查它继承的字段。

编辑:

我将检查 50 个模型的时间从 5 分钟减少到 30 秒。我有一张模型图:

type ModelType = 'user' | ...

type ModelsMap = {
  user: User,
  ...
};

getModel<T extends ModelType>(type: T): ModelsMap[T] {}
Run Code Online (Sandbox Code Playgroud)

这很慢,因为它ModelsMap[T]是所有模型的联合。T如果我在是所有模型类型的并集时返回基本模型,它会变得更快:

type TypeToModel<T extends ModelType> = ModelType extends T ? Model : ModelsMap[T];

getModel<T extends ModelType>(type: T): TypeToModel<T> {}
Run Code Online (Sandbox Code Playgroud)

然而,如果知道是否有一些技巧可以更快地比较子类,那还是很高兴的。例如,是否可以禁用结构类型并为子类使用名义值。

Don*_*al0 3

我不确定这对您的情况很有帮助,但您可以通过允许该incremental标志执行您的tsc命令来显着加快该过程:

// package.json
"tsc": "tsc -v && tsc --noEmit --skipLibCheck --incremental",
Run Code Online (Sandbox Code Playgroud)

这将创建一个tsconfig.tsbuildinfo文件,它实际上是代码库的图表。然后,Typescript 将仅比较您已更改的条目。第一次编译会很慢,因为它会生成图,但之后编译时间至少会减少3。