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

类型的联合被减少为“never”中断类型:类型被减少为“never”,因为属性在某些组成部分中有冲突的类型

类型的联合被减少为“never”中断类型是指在类型联合中存在冲突的类型,导致整个联合类型被缩减为"never"类型。"never"类型表示不可能发生的类型,即不存在的类型。

在类型联合中,如果存在某些组成部分的属性类型冲突,即无法满足所有组成部分的属性类型要求,那么整个联合类型就会被缩减为"never"类型。这意味着无法创建该联合类型的实例,因为它的属性类型是不可达到的。

这种情况通常发生在使用条件类型或交叉类型时,当属性类型之间存在冲突时,编译器会将整个联合类型缩减为"never"类型,以表示无法满足所有属性类型要求。

例如,考虑以下代码片段:

代码语言:txt
复制
type A = { type: "A", value: number };
type B = { type: "B", value: string };
type C = { type: "C", value: boolean };

type Union = A | B | C;

function processUnion(u: Union) {
  if (u.type === "A") {
    // 处理类型为A的情况
  } else if (u.type === "B") {
    // 处理类型为B的情况
  } else if (u.type === "C") {
    // 处理类型为C的情况
  }
}

const union: Union = { type: "A", value: 42 };
processUnion(union);

在上述代码中,类型Union是一个联合类型,包含了类型ABC。然而,如果我们在processUnion函数中使用了一个类型为Union的参数u,并尝试根据u.type的值进行不同的处理,那么编译器会发现Union类型中的属性value的类型存在冲突,无法满足所有属性类型要求。因此,整个联合类型Union会被缩减为"never"类型,导致无法创建Union类型的实例。

在这种情况下,我们可以通过检查never类型来捕获编译时错误,以确保我们处理了所有可能的联合类型情况。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript 4.8 发布!重点新特性解读

主要体现在联合类型、交叉类型以及类型收窄工作方式上。...例如,unknown 本质上其实接近联合类型 {}| null | undefined,因为它可以接受 null、undefined 和任何其他类型。...这个写法上稍为有点复杂了,因为要多判断一次第一个元素是否字符串类型,所以需要多写一次三元运算符,所以 TypeScript 4.7 引入了更简洁语法 infer 和 extends 可以配合使用:...U : never; TypeScript 4.8 对模版字符串中使用 infer extends 情况进行了优化,下面这种情况 infer 以前会被约束一个原始类型,现在可以推断出更精确值:...经过实验,一个比较大内部代码库中,许多简单常见操作减少了 10%-25% 时间,而在无文件更改情况下减少了大约 40% 时间。

83920

TS 进阶 - 类型系统

比较对象类型属性时,同样会采用结构化类型系统进行判断。...),object 包含了所有非原始类型类型,即数组、对象与函数类型,这些导致了二者年中有我,我中有现象。...联合类型 只需要比较一个联合类型是否可以视为另一个联合类型类型联合类型每个成员另一个联合类型中都存在对应成员 type Result1 = 1 | 2 | 3 extends 1...(y as any); } // 因为两个参数都引用了泛型参数 T,因此泛型会被填充一个联合类型 universalAdd(1, 2); // T 填充 1 | 2 universalAdd('...never : T; 具体实现其实就是条件类型分布式特性,即当 T、U 都是联合类型时,T 成员会依次拿出来进行 extends U ?

1.1K50

TypeScript性能优化(一)编写易于编译代码

interface 创建一个单一平面对象类型来检测属性冲突,另一方面,和其他类型扩展只是递归地归并属性某些情况下会产生 never 。interface 一致性也更好。...某种程度上,这是因为命名类型往往比匿名类型更紧凑(编译器可能会更容易推断出匿名类型),这减少了花费在读取和写入声明文件上时间(例如用于增量构建)。...但是,如果你联合类型有很多元素,这将引起编译速度问题。 当大量联合类型交叉一起时发生这种检查,会在每个联合类型上相交导致大量类型,需要减少这种情况发生。...:假如你定义每种内置 DOM 元素类型。...这有益于避免一次编译中导入太多文件,也使某些代码库布局策略更容易地放在一起。 有一些非常基本方法将一个代码库分解成多个项目。

1.3K10

TS 实用技巧

1.前言 Typescript 项目中广泛使用,随着项目的复杂度上升,类型标注越来越繁琐。...,我们简单回顾一下会用到知识点 2.1 keyof 返回一个对应类型key 联合类型 type Point = { x: number; y: number }; type P = keyof Point...此外,变量也可能是 never 类型,当它们永不为真的类型保护所约束时。...具体实现 3.1 基本类型增加Set方法 1.首先获取model 基本key /** *获取T key对象,如果T[key]基本类型,key与value 相等;反之为nerver *使用keyof...) => Address; // } 4.总结 本文讨论一些基于TS类型实现工具函数,TS 本身提供类型比较有限,需要我们日常开发过程中自定义一些工具函数来减少一些类型重复定义工作(2021最后一天啦

33310

【TypeScript 演化史 — 第三章】标记联合类型never 类型

标记联合类型是其成员类型都定义了字面量类型区分属性联合类型。 上面的讲的是理论性,来几个例子看看更贴切。...类似地,下面函数返回类型推断 never // Type (message: string) => never const failwith = (message: string) => {...不可能有该类型变量 另一种情况是,never 类型推断从不为 ture。在下面的示例中,我们检查 value 参数是否同时是字符串和数字,这是不可能。...在这种情况下,TypeScript 推断出 never 类型因为咱们已经将 value 参数注解类型 string | number,也就是说,除了string 或 number, value 参数不可能有其他类型...但是,咱们也就不能对 value 做任何有用事情,因为类型never,所以咱们编辑器工具不会显示自动显示提示该值有哪些方法或者属性可用。 ?

1K20

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

中写代码,尽可能减少 any 使用; 回到旧代码,开始添加类型注解,并修复已识别的错误; 第三方 JavaScript 代码定义环境声明。...考虑使用 jquery 用例,你可以非常简单快速它创建一个定义: declare var $: any; 有时候,你可能想给某些变量一些明确定义(如:jquery),并且你会在类型声明空间中使用它...('Not Implemented') },foo 返回类型never) 你也可以将它用做类型注解: let foo: never; // ok 但是,never 类型仅能赋值给另外一个 never...当一个函数没有返回值时,它返回了一个 void 类型,但是,当一个函数根本就没有返回值时(或者总是抛出错误),它返回了一个 never,void 指可以赋值类型 strictNullChecking... false 时),但是 never 不能赋值给其他任何类型,除了 never TypeScript 索引签名 JavaScript 一个对象类型索引签名上会隐式调用 toString 方法

1.9K30

【万字长文】深入理解 Typescript 高级用法

使用 联合类型(Union Types) 时,虽然有 类型守卫(Type guard),但是某些场景下依然不够好用。...你是否自己使用 Javascript 中了某些 「骚操作」 用极简短代码解决了某个复杂代码而沾沾自喜,但却为不正确 「返回类型」 挠秃了头。...举例说明 "高级用法" 使用场景 举个栗子: Redux 中有一个叫作 combineReducers 函数,因为某些场景,我们需要增加一个 combineReducersParamFactory...NeverTest2 = string & never // never 重要知识出现了:T | never,结果 T。...看到这里,相信聪明同学们已经有思路了,我们可以用 never 来过滤掉 联合类型(Union Types) 中不和期望类型,其实这个 「泛型操作符」 早在 Typescript 2.8[6] 就已经加入到了官方文档中了

3.3K20

Typescript 高级用法以及项目实战问题

function foo() {} // 这个空函数没有返回任何值,返回类型缺省void const a = foo(); // 此时a类型定义void,你也不能调用a任何属性方法 void...++; } } // Error: 这个无法将返回值定义never因为无法静态编译阶段直接识别出 还有就是永远没有相交类型: type human = 'boy' & 'girl' //...这两个单独字符串类型并不可能相交,故humannever类型 不过任何类型联合never 类型,还是原来类型: type language = 'ts' | never // language...]: 类型 四、泛型 泛型 TS 中可以说是一个非常重要属性,它承载了从静态定义到动态调用桥梁,同时也是 TS 对自己类型定义元编程。...never : T 注意这里 extends 返回 T 是原来 T 中和 U 无交集属性,而任何属性联合 never 都是自身,具体可在上文查阅。

1.9K50

【TypeScript】never 和 unknown 优雅之道

值会永不存在两种情况: 如果一个函数执行时抛出了异常,那么这个函数永远不存在返回值(因为抛出异常会直接中断程序运行,这使得程序运行不到返回值那一步,即具有不可达终点,也就永不存在返回了); 函数中执行无限循环代码...当然这时候如果你使用了 ts,它会给你一个编译器提示: Error: Unreachable code detected.ts(7027) 因为 process.exit() 返回类型定义为了 never...因此,函数输出 promise 返回值类型 { userName: string } | never。 又因为 never 是最小因子,可以消去。...type 'never' const x: Return = 3; 收窄联合类型时,never 也巧妙地发挥了它作为最小因子作用。...never : null) // 多个分支得到结果,再次联合 => string | never // never 联合类型运算中被消解 => string 4.2.3 Exhaustive

1.2K20

一文看懂TypeScript工具类型

联合类型赋值时候是相联合类型综合。子类型与父类型联合结果是父类型,任何类型never联合是任何类型。对于类、接口等对象联合,可赋值是其中任意一个,但访问只能访问所有类型共有属性和方法。。...之所以这么做,是因为联合类型对象在任何特定时刻只能符合其中一个类型,因此 TypeScript 需要一种方法来确保你访问属性在所有可能类型中都是存在。...(这条重要); any 返回是number | string | symbol联合类型(通常用来做键约束); unknown 返回never; 原始类型返回对应对象上属性或方法名; 联合类型返回公共属性名...这里需要回顾一下联合类型中,任何类型never 类型联合是任何类型。...它是已经类型删掉某些属性从而形成新类型。 // 使用: type T = { a?

6010

构造类型抽象、TypeScript 编程内参(二)

---- 这里只是个简单引子,抽象意义在于减少重复事情,类型抽象意义在于减少冗余类型说明(减少重复类型说明) 实际 TS 编程时候应该特别注意:通过构造类型抽象,尽量复用原有的类型声明,...四、构造 never 类型 了解联合和交叉类型后,聪明你也许已经发现了类似这样类型表达式: type WTF = 'A' & 'B'; 既是字符串 'A' 又是字符串 'B' 「薛定谔值」?..., // 因为在这里 T 类型是 {} // 它并不满足 HasName 约束 六、构造对象索引 实际代码运行过程中,我们总是有这样一种需求 有这样一种对象 Map:其键是某个唯一 Key,...如果你喜欢用 Array.prototype.reduce 规约数组的话,对象索引会用比较多 七、利用 keyof 构造键名联合 keyof 是 ts 提供类型运算符,用于取出对象类型键名联合,返回结果是一个联合类型...,因为只有 extends 语境下,才能体现 infer 语义:动态地给类型某个结构命名 以便在后续 TRUE 分支里面使用。

67130

Typescript中extends关键字

这是因为 Human 和 Duck 类型完全相同,或者说 Human 类型一切约束条件,Duck 都具备;换言之,类型 Human 值可以分配给类型 Duck 值(分配成功前提是,Duck...'yes' : 'no'; // Bool => 'no' 当我们给Human加上一个occupation属性,发现此时Bool是'no',这是因为 Duck 没有类型stringoccupation...A3定义中,给T传入是'x'和'y'联合类型'x' | 'y',满足分配律,于是'x'和'y'拆开,分别代入P P => P | P 'x'代入得到...never认为是空联合类型,也就是说,没有联合联合类型,所以还是满足上面的分配律,然而因为没有联合项可以分配,所以P表达式其实根本就没有执行,所以A2定义也就类似于永远没有返回函数一样...keyof T则是用来约束K条件,即,传入K参数必须使得这个条件真,否则ts就会报错,也就是说,K联合项必须来自接口T属性

5.3K132

Typescript中extends关键字

这是因为 Human 和 Duck 类型完全相同,或者说 Human 类型一切约束条件,Duck 都具备;换言之,类型 Human 值可以分配给类型 Duck 值(分配成功前提是,Duck...'yes' : 'no'; // Bool => 'no' 当我们给Human加上一个occupation属性,发现此时Bool是'no',这是因为 Duck 没有类型stringoccupation...A3定义中,给T传入是'x'和'y'联合类型'x' | 'y',满足分配律,于是'x'和'y'拆开,分别代入P P => P | P 'x'代入得到...never认为是空联合类型,也就是说,没有联合联合类型,所以还是满足上面的分配律,然而因为没有联合项可以分配,所以P表达式其实根本就没有执行,所以A2定义也就类似于永远没有返回函数一样...keyof T则是用来约束K条件,即,传入K参数必须使得这个条件真,否则ts就会报错,也就是说,K联合项必须来自接口T属性

91420

【TypeScript】TS条件类型(十二)

| {}> // "function" | "object"二、分布式条件类型条件类型中,如果检查类型是一个 “裸” 类型参数,即没有数组、元组或 Promise 等包装过,则该条件类型被称为分布式条件类型...,也不是其他原始类型四、结合范型使用1.类型删除联合类型T中删除联合类型U中成员,T类型剩余成员则组成新类型。...never : T;type A = Diff; // "b"联合类型T中过滤出联合类型U中成员,过滤出来成员则组成新类型。...R : never;定义了FunctionReturnType条件类型,它会检查类型T是否函数类型,如果是则通过infer获取函数返回值类型R,否则返回never类型。...T[K] : never;上面代码定义了类型PropertyType,通过检查K是否是T一个属性名,如果是则返回该属性类型,否则返回never

19310

TypeScript条件类型(十)

| {}> // "function" | "object"二、分布式条件类型条件类型中,如果检查类型是一个 “裸” 类型参数,即没有数组、元组或 Promise 等包装过,则该条件类型被称为分布式条件类型...,也不是其他原始类型四、结合范型使用1.类型删除联合类型T中删除联合类型U中成员,T类型剩余成员则组成新类型。...never : T;type A = Diff; // "b"联合类型T中过滤出联合类型U中成员,过滤出来成员则组成新类型。...R : never;定义了FunctionReturnType条件类型,它会检查类型T是否函数类型,如果是则通过infer获取函数返回值类型R,否则返回never类型。...T[K] : never;上面代码定义了类型PropertyType,通过检查K是否是T一个属性名,如果是则返回该属性类型,否则返回never

19920

TS 进阶 - 类型编程

DeepWritable : T[K]; }; 内置工具类型中有一个从联合类型中提出 null | undefined 工具类型,可以借助其实现一个剔除所有属性 null 与 undefined...DeepNullable : Nullable; } 基于已知属性进行部分修饰,如让一个对象一部分已知属性变成可选,只要将该对象拆 A 和 B 两个对象结构,分别由已知属性和其他属性组成...需要标记为可选属性,默认值 T 所有属性 > = Partial> // 标记为可选属性组成对象结构 & Omit; // 不需要处理那部分属性组成对象结构...由于模板字符串类型最终产物还是字符串字面量类型,因此只要插槽位置类型匹配,字符串字面量类型就可以认为是模板字符串类型类型: declare let v1: `${number}....为了与映射类型实现更好协作,TypeScript 引入模板字符串类型时支持了一个叫重映射新语法,基于模板字符串类型与重映射,可以实现:映射键名时基于原键名做修改: // 通过 as 语法,将映射键名作为变量

74130

实现TypeScript中互斥类型

: string }; never类型 TypeScript中它有一个特殊类型never,它是所有类型类型,无法再进行细分,也就意味着除了其本身没有类型可以再分配给它。...我们举个例子来解释下上述话语,如下所示: 我们定义了一个变量amazing,给其赋予了never类型。 我们分别给它赋了不同类型值,全部编译失败,因为它无法再进行细分了。...{}类型 amazing = [];// 报错:amazing是never类型不能分配给[]类型 剔除联合类型属性 有一组联合类型"a" | "b" | "c" | "d",我们想剔除属性b和c,... // "a" | "d" 将对象中所有属性转为联合类型 有一个对象它包含2个可选属性name、title,我们想把它转为联合类型name...实现代码 接下来,我们来看下代码实现,如下所示: // 定义排除类型:将U从T中剔除, keyof 会取出T与U所有键, 限定P取值范围T中所有键, 并将其类型设为never type Without

3.1K40
领券