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

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

TypeScript 2.0 实现了一个相当有用的功能:标记联合类型,您可能将其称为 sum 类型或与其他编程语言区别开的联合类型。...使用标记的联合类型构建付款方式 假设咱们为系统用户可以选择的以下支付方式建模 Cash (现金) PayPal 与给定的电子邮件地址 Credit card 带有给定卡号和安全码 对于这些支付方法...使得使用标记联合类型非常顺利。...使用最少的 TypeScript 语法开销,咱可以编写几乎纯 JS,并且仍然可以从类型检查和代码完成中受益。...使用标记联合类型构建 Redux 操作 标记联合类型真正发挥作用的用例是在 TypeScript 应用程序中使用 Redux 时。

1.1K20

【TypeScript】never 和 unknown 的优雅之道

从上文我们知道,除了 never 自身,没有任何类型能赋值给 never。any 是否满足这个特性呢?...4.2 never 的妙用 never 有以下的使用场景: Unreachable code 检查:标记不可达代码,获得编译提示。 类型运算:作为类型运算中的最小因子。...never : T // 运算过程 type NonNullable // 联合类型被分解成多个分支单独运算 => (string extends NullOrUndefined...never : null) // 多个分支得到结果,再次联合 => string | never // never 在联合类型运算中被消解 => string 4.2.3 Exhaustive...通过深入了解 never 和 unknown 在 TypeScript 类型系统中的使用和地位,可以学习到不少类型系统设计和集合论的知识,在实际开发中合理 narrow 类型,组织起可靠安全的代码。

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    TypeScript 官方手册翻译计划【九】:类型操控-条件类型

    TrueType : FalseType; 当 extends 左边的类型可以赋值给右边的类型时,最终得到的就是第一个分支(真分支)中的类型,否则得到第二个分支(假分支)中的类型。...就像使用类型保护实现的类型收缩可以得到一个更具体的类型一样,条件类型的真分支可以通过我们检查的类型进一步地去约束泛型。...在这段代码中,TypeScript 抛出了一个错误,因为它无法确定 T 是否有 message 属性。...,并在 message 属性不存在的时候默认使用 never 类型,应该怎么做呢?...Type[] : never; 如果我们给 toArray 传入一个联合类型,那么条件类型将会应用给联合类型的每一个成员。

    80920

    这几个 TypeScript 类型,90% 的人说不出原因

    对如何阅读 TypeScript 源码感兴趣的同学,可以看我之前的一篇文章:《我读 TypeScript 源码的秘诀都在这里了》,或者看我刚上线的掘金小册《TypeScript 类型体操通关秘籍》,小册里会带大家从源码解释各种类型的原理...说明条件成立,boolean 是 union 或者 never 验证一下: 这里的 flags 就是每一个位表示一种类型,然后通过位运算的按位与来判断是否是那种类型: 这种方式占用空间小,计算速度快...1 : 2; type res = Test; debug 会发现并没有走到 mapType 那个分支,而走了另一个分支: 这就说明条件不满足,any 不是联合类型呀,我们也可以通过 flags...debug 会发现 never 也走到 mapType 这个分支了: 啥情况,never 又不是联合类型,咋分呀。...总结 TypeScript 的类型系统有一些特殊的设计: 条件类型当 checkType(左边的类型)是类型参数的时候,会有 distributive 的性质,也就是传入联合类型时会把每个类型单独传入做计算

    27020

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

    TypeScript 2.8版本引入了条件类型(Conditional Types),TS条件类型可以进行类型选择,具体用法可以使用三元运算符实现,JS中的三元运算符用法一样,通过判断得到最终结果,TS...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。

    27510

    TypeScript条件类型(十)

    TypeScript 2.8版本引入了条件类型(Conditional Types),TS条件类型可以进行类型选择,具体用法可以使用三元运算符实现,JS中的三元运算符用法一样,通过判断得到最终结果,TS...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。

    24120

    理解 TypeScript 类型收窄

    因此,TypeScript 能够从此代码块内的联合类型中排除 null 类型,从而产生更窄的类型,更易于使用。 此外,你还可以通过抛出异常或从分支返回,来收窄变量的类型。...“ 或 ”可辨识联合“,它在 TypeScript 中的应用范围非常广。...== undefined); // Type is (string | undefined)[] 可惜的是 TypeScript 也无法理解你的意图,但是如果你使用一个类型保护函数的话就可以: function...const check: never = foo; } } 注意在 else 分支里面,我们把收窄为 never 的 foo 赋值给一个显示声明的 never 变量。...通过这个示例,我们可以得出一个结论:使用 never 避免出现新增了联合类型没有对应的实现,目的就是写出类型绝对安全的代码。

    4.7K20

    TS 进阶 - 类型系统

    联合类型 只需要比较一个联合类型是否可以被视为另一个联合类型的子类型 即联合类型中的每个成员在另一个联合类型中都存在对应的成员 type Result1 = 1 | 2 | 3 extends 1...: 类型参数需要是一个联合类型 类型参数需要通过泛型参数的方式传入,不能直接进行条件类型判断 条件类型中的泛型参数不能被包裹 条件类型分布式特性的作用: 将联合类型拆开,每个分支分别进行一次条件类型判断...in keyof T]: T[P]; // }; type Mutable = { -readonly [P in keyof T]: T[P]; }; 注意,对于结构声明来说,一个属性是否必须提供仅取决于其是否携带可选标记...,即使使用 undefined 甚至 never 也不能将其标记为可选。...true : false; // false 函数类型的参数类型使用子类型逆变的方式确定是否成立,返回值类型使用子类型协变的方式确定是否成立。

    1.2K50

    Node.js 项目 TypeScript 改造指南(二)

    了解基础库、第三方库中的类型 写代码时,应注意基础库、第三方库中函数输入输出是否使用了 any,类型、接口是否直接、间接使用了 any。...结合 keyof、never、in 等特性,使 TypeScript 具有了一定程度上的类型运算能力,可以让我们获得一个类型的变体和衍生类型。...'object' : 'ref'] 如果 T 可以解释为联合类型,在条件判断中可以进行展开,除了联合类型,any、boolean、使用 keyof 得到的索引类型,都可以展开。...我们可以给类型属性增加只读或者可选标记,使用 - 号,可以把原本带有的只读和可选标记去掉,+ 代表增加,可以省略。...使用可辨识联合「Discriminated Unions[15]」可以让我们区分相似的类型。

    3.6K10

    TypeScript 4.7 beta 发布:NodeJs 的 ES Module 支持、新的类型编程语法、类型控制流分析增强等

    ' } 我们知道,对于可辨识联合类型的各个类型分支,其每一分支的属性类型之间应当是独立的,而同一分支内部的类型又应该关联。...而在这里,很明显三个分支的类型并没有独立起来,否则每一分支的 f 入参类型应当对应于此分支的 v 类型。...无法使用 __dirname, __filename,require 这些全局的变量或方法 因此在 4.7 版本,TypeScript 也将会读取这一配置字段来决定是否将文件作为 ESM 解析,以及如何查找这一文件导入的模块...、构建产物是否使用 ESM 等。...我们可以使用它来判断类型的兼容性、收窄或映射一组联合类型、配合 infer 提取类型片段(如,数组的元素类型,函数的参数类型,模板字符串类型的某一部分)等。

    5.9K30

    【TypeScript 4.5】004-第 4 章 类型缩小

    【TypeScript 4.5】004-第 4 章 类型缩小 一、typeof 类型守卫 1、什么是类型缩小 含义 TypeScript 类型缩小就是从宽类型转化为窄类型的过程 类型缩小常用于处理联合类型变量的场景...if(strs && typeof strs === "object"){ // ... } } 三、等值缩小 1、说明 TypeScript 也可以使用分支语句做全等(=)、全不等...fly } 五、instanceof 操作符缩小 1、概述 说明 JavaScript 使用 instanceof 操作符来检查一个值是否是另一个值的实例 instanceof 也是一个类型保护 TypeScript...在由 instanceof 保护的分支中来实现类型缩小 代码分析 X instanceof Foo // 用来检查 X 的原型链是否含有 Foo.prototype 2、代码演示 代码示例 function...类型与穷尽性检查 1、概述 在缩小范围的时候 我们可以将联合体的选项减少 直到删除了所有可能性 这个时候我们使用 never 类型表示 never 类型表示不应该存在的状态 never 可以分配给任何类型

    4200

    以淘宝店铺为例,谈谈 TypeScript ESLint 规则集考量

    此规则的本质是检查经过断言后的类型子集是否仅剔除了空值部分,因此无需担心对于多种有实际意义的类型分支的联合类型误判。...如联合类型变量中每一条类型分支可能都需要特殊的处理逻辑。...你也可以通过 TypeScript 中的 never 类型来实现实际代码的检验: const strOrNumOrBool: string | number | boolean = false; if...{_exhaustiveCheck}`); } 这里通过编译时与运行时做了两重保障,确保为联合类型新增类型分支时也需要被妥善的处理,你可以参考开头的 never 类型 文章了解更多 never 相关的使用...除了联合类型以外,你还可以通过 never 类型来确保每一个枚举成员都需要处理。

    2.7K30

    深入解析 TypeScript 中的 UnionToIntersection 类型工具

    实际上,任何类型都可以被视为 any 的子类型,因此这一条件总是为真。?:表示条件为真时执行的分支。(x: T) => any:这是一个函数类型,其参数为类型 T,返回值为 any。...: never:条件为假时的分支,由于条件总是为真,因此这个分支不会被执行。...(x: infer R) => any:检查前面的函数类型是否可以分配给此形式,同时推断出 R 的值。? R : never? R:如果推断成功,则返回推断出的类型 R。...通过分析与实际示例,可以清晰地看到其工作原理与适用场景。在复杂类型系统中,它能够显著提升类型表达能力与代码的健壮性。注意事项确保联合类型的成员可以合法地交叉,否则结果可能是 never。...使用时要避免过于复杂的嵌套联合类型,否则可能导致类型推导性能问题。

    6400

    类型体操:探究 TypeScript 内置高级类型

    never : T; 这里涉及到一个经常用到的 条件语法:extends ? :,你可以把它类比为 JS 中的三元表达式(即 condition ? a : b)。...回到我们的 Exclude,逻辑就很清楚了,就是判断 T 是否为 U 的子类,如果是的话,返回 never(效果是被丢弃);否则返回 T。...其实这是联合类型的特殊逻辑,如果联合类型使用了 extends,它就会被打散,变成多个独立的类型进行判断,最后再组合起来。...所以真正逻辑是, "a" | "b" | "c" 被打散,变成依次判断 "a" 、"b"、"c" 是否为 "b" 的子类,分别得到 "a" 、never、"c",然后联合起来,就变成了 "a" |...TypeScript 的类型是图灵完备的,可以实现各种判断、循环、加减的逻辑。当然某些逻辑实现起来很繁琐就是了。 它的语法也是与众不同:它做了 “压缩”。

    86910

    什么是 TypeScript 4.1 中的模板字面类型?

    我们可以通过输出 never 来过滤键,这样在某些情况下就不必使用额外的 Omit 辅助类型: type Getters = { [K in keyof T as `get${Capitalize...这意味着如果我们需要访问上一个示例中的 opts.path 之类的属性,则必须检查其是否存在或使用非 null 断言运算符(后缀 !...abstract 成员不能被标记为 async 在另一个重大更改中,标记为 abstract 的成员不能被再标记为 async。...因此,要修复您的代码,必须删除 async 关键字: abstract class MyClass { // 在 TypeScript 4.1 中必须删除 async abstract async...owner, defaultUserId: 123, }; } 在TypeScript 4.1之前, getOwner 返回基于每个展开对象的联合类型: { x: number } | {

    3.9K10

    【TS 演化史 -- 17】各文件的JSX工厂 、有条件类型和映射类型修饰符

    never类型是 TypeScript 的底层类型,表示从未出现的值的类型。 分布式有条件类型 那么,为什么e 条件类型和never类型的组合是有用的呢?它有效地允许咱们从联合类型中删除组成类型。...| string[] | never | never; 因为never是每个类型的子类型,所以可以从联合类型中省略它: type NonNullableEmailAddress = string...TypeScript 通过逐个查找每个类型并创建联合类型来解决这个问题: type NonNullableUserPropertyKeys = | { name: "name"; email: never...咱们可以通过清除never类型来简化生成的联合类型: type NonNullableUserPropertyKeys = "name"; User类型中唯一不可为空的属性键是“name”。...>; // string 注意,推断的类型变量(在本例中为U)只能在条件类型的true分支中使用。

    2.5K20
    领券