首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

来自枚举的Typescript类型推断抛出“类型实例化过于深入,可能是无限的”。

基础概念

在 TypeScript 中,枚举(Enum)是一种特殊的数据类型,它允许你定义一组命名的常量。然而,当 TypeScript 编译器尝试推断枚举类型的实例时,可能会遇到“类型实例化过于深入,可能是无限的”错误。这个错误通常发生在递归类型或深度嵌套的类型推断中。

相关优势

枚举类型的优势包括:

  • 代码可读性:通过命名常量,代码更易读、易懂。
  • 类型安全:枚举提供了类型检查,减少了运行时错误。
  • 易于维护:修改枚举值时,所有引用该枚举的地方都会自动更新。

类型

TypeScript 枚举有两种类型:

  1. 数字枚举:默认情况下,枚举成员的值是自动生成的数字。
  2. 字符串枚举:枚举成员的值是字符串。

应用场景

枚举常用于表示一组固定的选项,例如:

  • 状态码(如 PendingApprovedRejected
  • 方向(如 NorthSouthEastWest

问题原因

“类型实例化过于深入,可能是无限的”错误通常是由于 TypeScript 编译器在尝试推断递归或深度嵌套的类型时,无法确定类型的终止条件。这可能发生在以下情况:

  • 递归类型定义
  • 深度嵌套的枚举或对象

解决方法

  1. 避免递归类型:确保类型定义中没有递归引用。
  2. 限制嵌套深度:减少类型嵌套的深度。
  3. 使用类型断言:在某些情况下,可以使用类型断言来明确指定类型。

示例代码

假设我们有以下递归枚举定义:

代码语言:txt
复制
enum Node {
    A = Node.B,
    B = Node.C,
    C = Node.A
}

这段代码会导致“类型实例化过于深入,可能是无限的”错误。解决方法之一是避免递归引用:

代码语言:txt
复制
enum Node {
    A = "A",
    B = "B",
    C = "C"
}

或者使用字符串枚举:

代码语言:txt
复制
enum Node {
    A = "A",
    B = "B",
    C = "C"
}

参考链接

通过以上方法,可以有效避免“类型实例化过于深入,可能是无限的”错误,并确保 TypeScript 编译器能够正确推断类型。

相关搜索:类型实例化过于深入,可能是无限的,带有情感样式+ material-ui + typescriptTypeScript推断:泛型类型被实例化为过于宽松的类型(null在中统一)从Typescript中的错误抛出函数推断类型?typescript无法推断来自回调函数的类型来自枚举不同类型的Typescript接口键如何修复插入枚举值时“无法推断用于枚举实例的SQL类型”错误?如何在Visual Studio代码中复制非类型化函数(TypeScript)的推断类型类型实例化的两个组合泛型结果过深,可能是无限的。(2589)如何从使用Typescript的枚举输入中推断出方法返回类型?为什么Typescript不能根据枚举switch语句推断出正确的类型?如何在TypeScript中从枚举创建类型化的模板文字?如何在实例化模板化的类类型时抛出错误?在Typescript中将类型定义为“来自枚举的所有可能性”Typescript不会推断未定义为来自array.prototype.find的返回类型Typescript:类型化接口不允许来自其类型字符串litteral的值有没有办法在TypeScript中实例化约束泛型类型的实例?如何在只接受原语的TypeScript中实例化泛型类型/接口TypeScript:当提供变量类作为函数参数时,推断返回类型是该类的实例(仅从参数)在TypeScript中获取Record<string的键,{}> (或使用推断的键和类型化的值定义object在Typescript中,如何在工厂(Ish)函数中实例化的类上获取方法的泛型返回类型
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TS 如何进行完整性检查

例如, never 类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头函数表达式返回值类型。此外,变量也可能是 never 类型,当它们被永不为真的类型保护所约束时。...never = (() => { throw new Error('TypeScript never'); })(); 另外,对于死循环函数或执行时总会抛出异常函数来说,函数对应返回值类型也是...因此,我们可以在 A 行中实例以下异常: class UnsupportedValueError extends Error { constructor(value: never) { super...throw new UnsupportedValueError(x); // Error } } 以上报错信息很明显,因为我们只处理了 NoYes.Yes 情形,TypeScript 编译器会推断出...好处:实现起来简单 缺点: 运行时无保护,即不会抛出任何异常 不适用于 if 语句 四、总结 本文介绍了 TypeScript 中实现完整性检查两种方法并通过实际例子来介绍它们之间差异。

2K20

TypeScript 官方手册翻译计划【二】:普通类型

实际上这并不让人意外,“联合”这个名词来自类型理论。联合类型 number | string 是由每个类型联合组成。...即使类型断言是错误,也不会抛出异常或者产生 null TypeScript 只允许断言之后类型比之前类型更具体或者更不具体。...字面量推断 当你初始一个变量为某个对象时候,TypeScript 会假定该对象属性稍后可能会发生变化。...枚举 枚举TypeScript 添加到 JavaScript 中一项特性。它允许描述一个值,该值可以是一组可能命名常量中一个。...与大多数 TypeScript 特性不同,枚举不是在类型层面添加到 JavaScript 中,而是添加到语言本身和它运行时中。

2.2K20
  • TypeScript入手,驾驭HarmonyOS开发技术风潮!-------(上篇)

    他们关系如图所示: TypeScript语法 如果是前端研发掌握起来无压力, 如果是其他方向研发, 大约需要半个月左右时间去掌握, 当然如果想更加深入掌握TypeScript则需要掌握JavaScript...,而JavaScript 初步掌握需要时间大约在 一个月左右, 深入掌握因人而异, 可能是三个月也可能是半年 TS数据类型 布尔值 只有 true 和 false 两个值。...这些值可能来自于动态内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段检查。...类型推断: TS会在没有明确指定类型时候推测出一个类型 有下面2种情况: 1....定义变量时赋值了, 推断为对应类型 2.

    15410

    TypeScript 常用知识总结

    二、新添功能 类型批注和编译时类型检查 类型推断 类型擦除 接口 枚举 Mixin 泛型编程 名字空间 元组 Await 以下功能是从 ECMA 2015 反向移植而来: 类 模块 lambda 函数箭头语法...TypeScript 引入了命名空间 TypeScript 优势 静态输入: 静态类型是一种功能,可以在开发人员编写脚本时检测错误。查找并修复错误是当今开发团队迫切需求。...这意味着声明为 never 类型变量只能被 never 类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环) 变量不要使用 name 否则会与 DOM 中全局 window 对象下...TypeScript 一次只能继承一个类,不支持继承多个类,但 TypeScript 支持多重继承(A 继承 B,B 继承 C) Typescript对象必须是特定类型实例 var sites...语法:值 或 值 as 类型 eg: let str = '1' let str:number = str 类型推断类型没有给出时,TypeScript 编译器利用类型推断推断类型

    1.8K30

    TypeScript(3)基础类型

    大家好,又见面了,我是你们朋友全栈君。 基础类型 TypeScript 支持与 JavaScript 几乎相同数据类型,此外还提供了实用枚举类型方便我们使用。...使用枚举类型可以为一组数值赋予友好名字。...这些值可能来自于动态内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段检查。...例如, never类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头函数表达式返回值类型; 变量也可能是 never类型,当它们被永不为真的类型保护所约束时。...类型推断 类型推断: TypeScript会在没有明确指定类型时候推测出一个类型 有下面2种情况: 定义变量时赋值了, 推断为对应类型.

    48930

    TypeScript 快速入门(基础篇)

    )、泛型(Generics)、类(Classes)、枚举类型(Enums)等前端工程师可能不是很熟悉概念; x集成到构建流程需要一些工作量; x短期可能会增加一些开发成本,毕竟要多写一些类型定义,不过对于一个需要长期维护项目...,否则报错 枚举 enum enum类型是对JavaScript标准数据类型一个补充。...| undefined = 33; console.log(newNum) // 输出 33 never 类型 never 代表不存在类型,常用作为 抛出异常或者 无限循环函数返回类型 #...} const aa = getAny() console.log(aa)//999 'Hello TypeScript' 类型检测 类型推断 变量声明和初始在同一行时,可以省去类型声明 const...names = 'XiaoMing' 此时names变量类型为 string names = 22 // TS 已经推断出了names 类型为string,而不能赋值为 其它类型 console.log

    98320

    深入类型系统_TypeScript笔记8

    一.类型推断 赋值推断 类型推断机制减轻了强类型带来语法负担,例如: let x = 3; // 等价于 let x: number = 3; 编译器能够根据变量初始值3推断出变量类型是number...语句 二.子类型兼容性 TypeScript13种基本类型中,类型层级关系如下: ?...,目标类型缺少相应可选参数也是合法 对于剩余参数,就当成是无限多个可选参数,也不要求严格匹配。...} let sum: sum = add; sum函数有两个重载版本,所以目标函数至少要兼容这两个版本 四.枚举 首先,来自不同枚举类型枚举值不兼容,例如: enum Status { Ready,...,但在类型系统中认为二者不兼容,因此报错 五.类 类与对象字面量类型和接口类似,区别在于,类同时具有实例类型和静态类型,而比较两个类实例时,仅比较实例成员 因此,静态成员和构造函数并不影响兼容性: class

    98840

    TypeScript 黑魔法之编译选项设置

    也就是说,传统编程语言在类型系统允许与不允许之间存在明显边界。TypeScript不同于传统编程语言,它可以让你自己设置类型系统边界。...因此,这里有一个noImplicitAny选项,当开启这个选项时,它将会标记无法被推断类型情况,如下所示。...一个非null断言实质上意味着你在告诉编译器“我知道它不是null,但是请让我使用它,即使它不是null”。 明确赋值断言操作符 TypeScript将会对类中未初始属性抛出错误。...本文节选自博文视点新书《深入理解TypeScript》。...本书首先介绍了TypeScript与JavaScript关系,讲解了TypeScript类型系统基础语法,对初学者非常友好;然后全面阐述了 TypeScript 各种“魔法”,并且深入地剖析了TypeScript

    86240

    【译】2019年开始使用Typescript

    基本静态类型 好吧,我们来深入研究下TypeScript语法。以下是TypeScript中最常见类型。 备注:我遗漏了never和object类型,因为根据我经验,它们并不被经常使用。...类型推断 幸运是,你不需要在代码中全部位置指定类型,因为TypeScript具有类型推断类型推断TypeScript编译器用来自行决定类型(内容)。...基本类型推断 TypeScript可以在变量初始期间,设置默认参数以及确定函数返回值时推断类型。...string默认值,因此TypeScript编译器会推断出message类型是string,因此在访问length属性时候并不会抛出编译错误。...最佳通用类型推断 从多种可能类型推断类型时,TypeScript使用最佳通用类型算法来选择适用于所有其他候选类型类型

    2.2K20

    4000字讲清 《深入理解TypeScript》一书 【基础篇】

    TypeScript,已经成为前端避不开基础 在读完《深入理解TypeScript》之后,写下这篇总结 TypeScript解决最关键痛点是什么?...,初始第一个成员,以便生成代码不是先前定义枚举类型值。...如果想使用它,你必须使用完整 { (someArgs): someReturn } 语法 可实例: interface CallMeWithNewToGetString { new (): string...对一个简单类型 Base 和 Child 来说,如果 Child 是 Base 子类,Child 实例能被赋值给 Base 类型变量。...需要大家认真去看《深入理解TypeScript》 下一章,针对TypeScript原理、工程环境等进行进阶编写~ 写在最后: 觉得写得不错,欢迎关注微信公众号:前端巅峰

    1.9K30

    2019年开始使用Typescript

    基本静态类型 好吧,我们来深入研究下TypeScript语法。以下是TypeScript中最常见类型。 备注:我遗漏了never和object类型,因为根据我经验,它们并不被经常使用。...类型推断 幸运是,你不需要在代码中全部位置指定类型,因为TypeScript具有类型推断类型推断TypeScript编译器用来自行决定类型(内容)。...基本类型推断 TypeScript可以在变量初始期间,设置默认参数以及确定函数返回值时推断类型。...string默认值,因此TypeScript编译器会推断出message类型是string,因此在访问length属性时候并不会抛出编译错误。...最佳通用类型推断 从多种可能类型推断类型时,TypeScript使用最佳通用类型算法来选择适用于所有其他候选类型类型

    88020

    TypeScript基础知识

    ) { this.name = name; } sayHi(): void { console.log('Hi' + this.name); } } //使用new关键字来实例对象...新增类型 枚举类型(enum) Enum枚举类型用于定义数值集合,使用枚举我们可以定义一些带名字常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。...;//不会打印内容 } never类型 表示永不存在类型,一般指总是会抛出异常或根本就不会有返回值函数表达式或箭头函数表达式及函数中执行无限循环代码(死循环)返回值类型。...如果没有明确指定类型,那么 TypeScript 会依照类型推论规则推断出一个类型。...具体类型 1.可以直接在使用时给它定义类型 console.log(id('甜甜')); // 定义 T 为 string 类型 2.直接利用typescript类型推断 console.log

    2.2K20

    TypeScript手记(二)

    基本类型 TypeScript 支持与 JavaScript 几乎相同数据类型,此外还提供了实用枚举类型方便我们使用。...枚举 enum 类型是对 JavaScript 标准数据类型一个补充。...例如,我们将上面的例子改成从 1 开始编号; 或者,全部都采用手动赋值; 枚举类型提供一个便利是你可以由枚举值得到它名字。...这些值可能来自于动态内容,比如来自用户输入或第三方代码库。这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段检查。...例如, never 类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头函数表达式返回值类型;变量也可能是 never 类型,当它们被永不为真的类型保护所约束时。

    54520

    了解 TypeScript 原始类型:探索显式和隐式类型

    TypeScript中,变量可以明确或隐式地定义类型,并且该语言支持各种原始类型。让我们深入了解每种原始类型,探索示例,并了解显式和隐式类型之间区别。...let person: string, number = "John", 25;Enum(枚举):枚举是一种为一组数值提供更友好名称方式。...enum Color { Red, Green, Blue}let myColor: Color = Color.Green;显式类型声明:显式类型声明涉及在初始期间声明变量类型。...但是,在简单情况下,它需要更多按键操作,并且在某些情况下可能显得多余。隐式类型推断:隐式类型推断,也称为类型推断,允许TypeScript根据分配推断类型。...isActive = true; // TypeScript推断为 'boolean'隐式类型推断减少了冗长性,使代码更为简洁。

    17410

    作为JavaScript“超集”,感受一下TypeScript 那些黑魔法

    也就是说,传统编程语言在类型系统允许与不允许之间存在明显边界。 TypeScript不同于传统编程语言,它可以让你自己设置类型系统边界。...在TypeScript中,有很多选项都可以精确地控制此边界,下文选自《深入理解TypeScript》一书,现在就让我们去了解它们吧。...1tsc --someBooleanOption 所有这些选项默认设置都是false。 ▼▼▼ 有些代码无法被推断,或者推断它们可能会导致意外错误。...因此,这里有一个noImplicitAny选项,当开启这个选项时,它将会标记无法被推断类型情况,如下所示。...一个非null断言实质上意味着你在告诉编译器“我知道它不是null,但是请让我使用它,即使它不是null”。 ◆ 明确赋值断言操作符 TypeScript将会对类中未初始属性抛出错误。

    1K20

    TypeScript 基本类型和泛型使用

    //定义一个联合类型,当你数组中只有 number 和 string 类型时候 let a =(number | string)[] enum 枚举 enum 类型是对 JavaScript...像 C#等其他语言一样,使用枚举类型可以为一组数值赋予友好名字。...Any 有时候,我们会想要为那些在编程阶段还不清楚类型变量指定一个类型。 这些值可能来自于动态内容,比如来自用户输入或第三方代码库。...例如, never类型是那些总是会抛出异常或根本就不会有返回值函数表达式或箭头函数表达式返回值类型; 变量也可能是 never类型,当它们被永不为真的类型保护所约束时。...推断返回值类型为never function fail() { return error("Something failed"); } // 返回never函数必须存在无法达到终点 function

    2.5K40

    TypeScript 演化史 — 第八章】字面量类型扩展 和 无类型导入

    image.png 上一篇更好类型推断文章中,解释了 TypeScript 如何用 const 变量和 readonly 属性字面量始推断字面量类型。...扩展字面量类型 当使用 const 关键字声明局部变量并使用字面量值初始它时,TypeScript推断该变量字面量类型: const stringLiteral = "https"; // Type...: 字符串字面量类型被扩展为 string 类型 数字字面量类型被扩展为 number 类型 布尔字面量类型被扩展为 boolean 类型 枚举字面量类型被扩展为包含枚举类型 到目前为止,咱们一直在研究字面量类型扩展...无类型导入 从TypeScript 2.1 开始处理无类型导入更加容易。...以前,编译器过于严格,当导入一个没有附带类型定义模块时,会出现一个错误: image.png 从 TypeScript 2.1 开始,如果模块没有类型声明,编译器将不再报错。

    4.6K10

    淘宝店铺 TypeScript 研发规约落地实践|技术详解

    TypeScript 本身控制流分析其实也是做了相关优化,比如使用 const 声明原始类型变量,由于不会再被更新,你会发现它直接被推断为最精确字面量类型,而 let 则只会推断到基本类型。...或者在一些 ESLint 显得不那么智能,比如你希望强制要求某些函数入参来自枚举而不是字符串场景,你会开始关注如何使用 Compiler API 做源码分析和约束。...还有在一些 Lint 无法覆盖场景,也就是更严格约束,如你希望强制要求项目中必须导入某些模块作为 polyfill,某些函数入参来自枚举而不是字符串场景,那你会开始关注如何使用 Compiler...还有常量枚举,它会在构建时候直接被行内替换为具体枚举值,枚举对象是不会存在。但是其他工具根本不知道这个常量枚举,那么引用地方也就直接抛出错误了。...如果是在你场景下,它可能是基于 tsd 工具类型单元测试,可能是统一前后端类型生成与校验等等。 洋洋洒洒说了这么多 TypeScript 好处,是时候来稍微泼点冷水降降温了。

    1.1K20
    领券