打字稿:“该节点的推断类型超出了编译器将序列化的最大长度。需要显式类型注释。”

问题描述 投票:0回答:3

我收到错误

“该节点的推断类型超出了编译器序列化的最大长度。需要显式类型注释。”

这在几个小时前工作正常...我所做的任何更改(更新 npm 和节点)对于为什么会发生这种情况没有任何意义。

我绝对不能给出明确的类型注释。


我尝试过的:

这是我对我正在尝试制作的工具的第三次完整重写,因为 Typescript 一直落后于它。

经过三次完整重写、数百个小时和极大的努力,在这个错误开始出现之前,一切都工作正常一整天。

我尝试更新所有内容(typescript、node、npm...没有其他可更新的)

我尝试更新 tsconfig:

"compilerOptions": {
        "disableSizeLimit": true,

我不知道该怎么办。我能想到的唯一选择是将 Typescript 扔进垃圾桶并在编译时进行类型检查......我想这对于这个项目来说是很好的。


在该项目的第二次尝试中,我询问了如何更好的缓存

typescript compiler-optimization
3个回答
5
投票

"declaration": false,

将声明设置为 false

tsconfig.json
对我有用

还在github上找到了相关主题 https://github.com/microsoft/TypeScript/issues/43817

这是递归造成的,我也是这样

更新:显然这是真正的解决方案:

type Builder<T> = {
    withComment: (comment: string) => Builder<T & { comment: string }>,
    withSpecialComment: () => Builder<T & { comment: string }>,
    withTrackingNumber: (tracking: number) => Builder<T & { tracking: number }>,
    build: () => T
};

const Builder: <T extends {}>(model: T) => Builder<T> = <T extends {}>(model: T) => ({
    withComment: (comment: string) => Builder({ ...model, comment }),
    withSpecialComment: () => Builder(model).withComment('Special comment'),
    withTrackingNumber: (tracking: number) => Builder({ ...model, tracking }),
    build: () => model });

const a = Builder({});

https://github.com/microsoft/TypeScript/issues/43817#issuecomment-827746462

有了这个,你不需要将声明设置为 false


3
投票

好吧,我已经成功地把这个项目拖得更远了。这是我所做的主要更改:

将接口并集/交集转换为类并集/交集

我不知道为什么会这样,但是如果你有一些复杂的并集/交集,如下所示:

interface A { 
  a: true,
  // code omitted...
}

interface B { 
  b: true,
  // code omitted...
}

// code omitted...

type ComplexIntersection = A & B & C & D & E & F & G;

您可以将所有接口切换为抽象类,如下所示:

abstract class A { 
  public abstract a: true;
  // code omitted...
}

abstract class B { 
  public abstract b: true;
  // code omitted...
}

Typescript 语言服务器会对此感到高兴。我不知道为什么会这样,但这就是类型的样子

之前:

之后:


我尝试过但不起作用的其他事情:

  1. 删除我能找到的所有复杂类型
  2. 删除我可以删除的所有通用参数

0
投票

我在 typescript vue3 代码上遇到了这个问题。它突然出现,没有对文件进行任何更改。

这不是实际的错误,至少在我的代码中是这样。在关联服务文件中的导入接口中,有一个复合接口稍后引用该文件中的另一个接口,而不是之前。

这是一个很容易犯的错误,当我这样做时,vsCode 并没有正确地捕获错误。该代码甚至可以编译并运行得很好。一旦我修复了引用文件中的错误,虚假消息就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.