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

为什么typescript可以使用双重否定来推断非空类型,而不能使用布尔构造函数?

TypeScript可以使用双重否定来推断非空类型,而不能使用布尔构造函数的原因是因为它们的设计目的和语法规则不同。

首先,双重否定是一种类型推断的技巧,它利用了TypeScript的类型系统来推断变量的类型。通过使用双重否定,我们可以告诉编译器某个变量不可能是null或undefined,从而将其类型推断为非空类型。这种推断方式可以帮助开发者在编码过程中避免空指针异常等问题,提高代码的健壮性和可维护性。

布尔构造函数(Boolean constructor)是JavaScript中的一种构造函数,用于创建布尔类型的对象。在TypeScript中,布尔构造函数的返回类型是布尔类型(boolean),而不是非空类型。因此,使用布尔构造函数无法实现对非空类型的推断。

总结起来,双重否定是一种基于类型推断的技巧,可以帮助我们推断非空类型。而布尔构造函数是一种创建布尔类型对象的方式,与类型推断无关。在TypeScript中,我们可以利用双重否定来推断非空类型,但不能使用布尔构造函数来实现相同的效果。

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

  • 腾讯云官网:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
  • 云数据库(CDB):https://cloud.tencent.com/product/cdb
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙:https://cloud.tencent.com/solution/virtual-universe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript学习笔记(二)—— TypeScript基础

,未强调编译错误的代码片段,默认为编译通过 注意,使用构造函数 Boolean 创造的对象不是布尔值: let createdByNewBoolean: boolean = new Boolean(1)...{ return x + y; }; 这是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,等号左边的 mySum,是通过赋值操作进行类型推论推断出来的。...总之,一方面不能滥用 as any,另一方面也不要完全否定它的作用,我们需要在类型的严格性和开发的便利性之间掌握平衡(这也是 TypeScript 的设计理念之一),才能发挥出 TypeScript 最大的价值...,这里我们使用了简化的父类子类的关系表达类型的兼容性,实际上 TypeScript 在判断类型的兼容性时,比这种情况复杂很多,详细请参考[类型的兼容性(TODO)][]章节。...9.4、双重断言 既然: 任何类型可以被断言为 any any 可以被断言为任何类型 那么我们是不是可以使用双重断言 as any as Foo 将任何一个类型断言为任何另一个类型呢?

5K20

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

image.png 上一篇更好的类型推断的文章中,解释了 TypeScript 如何用 const 变量和 readonly 属性的字面量始化推断字面量类型。...扩展字面量类型 可以通过显式地将变量标注为字面量类型创建扩展字面量类型的变量 const stringLiteral: "https" = "https"; // 类型 "https" (扩展)...使用TypeScript 2.1,TypeScript 不是仅仅选择any类型,而是基于你后面的赋值推断类型。 仅当设置了--noImplicitAny编译参数时,才会启用此选项。...混合类的构造函数 (如果有) 必须有且仅有一个类型为any[]的变长参数, 并且必须使用展开运算符在super(...args)调用中将这些参数传递。 定义完成之后,研究一些代码。...,该签名描述了可以构造通用类型T的对象的类型,并且其构造函数接受任意数量的任何类型的参数。

4.5K10

TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型

例如:let str: string = "Hello";布尔类型布尔类型用于表示逻辑值,即 true 或 false。可以使用 boolean 关键字声明布尔变量。...null 类型用于表示值或者对象引用为可以使用 void 和 null 关键字声明对应的变量。...例如:let nothing: null = null; // 类型let nul: null = null; // 类型对象类型对象类型用于表示原始数据类型,包括对象、数组、函数等。...可以使用 (参数类型) => 返回值类型 的语法声明函数类型。...类型推断类型断言TypeScript 具有强大的类型推断能力,它可以根据上下文自动推断变量的类型。例如,如果我们在定义变量时直接赋值,TypeScript 可以推断出变量的类型

32930

TypeScript 演化史 — 第七章】映射类型和更好的字面量类型推断

转换后的属性组成新的类型使用映射类型可以捕获类型系统中类似 Object.freeze() 等方法的效果。冻结对象后,就不能再添加、更改或删除其中的属性。...这就是为什么当试图将 42 赋值给 x 属性时,TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(严格模式)。...请注意,以下只是出于解释目的,并不能准确反映TypeScript使用的解析算法。...可以使用Pick对该行为进行构建,正如其名称所示。 更好的字面量类型推断 字符串、数字和布尔字面量类型(如:"abc",1和true)之前仅在存在显式类型注释时才被推断。...} 只读类属性只能立即初始化,也可以构造函数中初始化。

3.8K40

10个写TypeScript代码的坏习惯

随意使用 any 类型 这种习惯看起来是什么样的 当你不确定结构时,可以用 any 类型。...从 JavaScript 转到 TypeScript 时,现有的代码库通常会对 TypeScript 编译器无法自动推断出的类型进行假设。...它还需要对正在构建的产品有更深入的了解,并且如果对产品的设计有所修改,可能会限制代码的使用为什么不该这样做 类型系统的最大好处是可以用编译时检查代替运行时检查。...对布尔类型的值进行布尔检查 这种习惯看起来是什么样的 通过直接将值传给 if 语句检查是否定义了值。...在对“布尔类型的值”进行布尔检查时 countOfNewMessages 为 0 的问题在使用 !! 时仍然会存在。 10. != null 这种习惯看起来是什么样的 棒棒运算符的小弟 !

66920

理解 TypeScript 类型拓宽

从表达式推断变量、属性或函数结果的类型时,源类型的拓宽形式用作目标的推断类型类型的拓宽是所有出现的类型和未定义类型都被类型 any 替换。 以下示例显示了拓宽类型以产生推断的变量类型的结果。...换句话说,它需要根据你指定的单个值确定一组可能的值。在 TypeScript 中,此过程称为拓宽。理解它可以帮助你理解错误并更有效地使用类型注释。...通过 TypeScript 的错误提示消息,我们知道是因为变量 x 的类型推断为 string 类型 getComponent 函数期望它的第二个参数有一个更具体的类型。...(vec, x); // OK 因为 x 不能重新赋值,所以 TypeScript 可以推断更窄的类型,就不会在后续赋值中出现错误。...它需要推断一个足够具体的类型捕获错误,但又不能推断出错误的类型。它通过属性的初始化值推断属性的类型,当然有几种方法可以覆盖 TypeScript 的默认行为。

1.6K40

TypeScript 演化史 -- 7】映射类型和更好的字面量类型推断

转换后的属性组成新的类型使用映射类型可以捕获类型系统中类似 Object.freeze() 等方法的效果。冻结对象后,就不能再添加、更改或删除其中的属性。...这就是为什么当试图将 42 赋值给 x 属性时,TypeScript 会出错。在运行时,分配要么抛出一个类型错误(严格模式),要么静默失败(严格模式)。...请注意,以下只是出于解释目的,并不能准确反映TypeScript使用的解析算法。...可以使用 Pick 对该行为进行构建,正如其名称所示。 更好的字面量类型推断 字符串、数字和布尔字面量类型(如:"abc",1和true)之前仅在存在显式类型注释时才被推断。...} 只读类属性只能立即初始化,也可以构造函数中初始化。

2.8K10

【万字长文】TypeScript入门指南

当一个函数没有返回值时,你通常会见到其返回值类型是 voidfunction fnvoid():void{ return//函数可以定义为值,如果定义了void则不能返回内容}//undefined...console.log(a)//输出{name:'叶秋学长',age:18}函数重载重载是方法名字相同,参数不同,返回类型可以相同也可以不同。...那为什么使用any呢?...,而非静态的需要在创建对象才存在静态属性是整个类都公用的生命周期不一样,静态在类消失后被销毁,静态在对象销毁后销毁用法:静态的可以直接通过类名访问,静态只能通过对象进行访问使用static注意事项带静态修饰符的方法只能访问静态属性静态方法既能访问静态属性也能访问静态属性静态方法不能定义静态变量静态方法不能使用...注:不是优先于构造函数执行,而是依托于构造函数,如果不创建对象就不会执行构造代码块普通代码块和构造代码块的区别在于,构造代码块是在类中定于的,普通代码块是在方法体中定义的,执行顺序和书写顺序一致。

40042

要改掉的 10 种 TypeScript 坏习惯

运算符是去年才引入的,所以在长函数中间使用值时,可能很难习惯将其设置为参数默认值。 为什么应该纠正它 与||不同,?? 仅对 null 或 undefined 回退,不对所有虚假值回退。...另外,如果你的函数太长而无法在开始时定义默认值,那么将它们拆分可能是个好主意。 3. 使用 any 类型 具体是什么意思 当你不确定结构时,将 any 用于数据。...从 JavaScript 转换为 TypeScript 时,现有的代码库通常会对 TypeScript 编译器无法自动推断出的类型进行假设。...它还需要对正在构建的产品有更深入的了解,并且如果对产品的假设发生更改,可能会限制代码的使用为什么应该纠正它 类型系统的最大好处是它们可以用编译时检查代替运行时检查。...布尔布尔检查 具体是什么意思 将一个值直接传递给 if 语句检查是否定义了这个值。 function createNewMessagesResponse (countOfNewMessages?

50220

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

有条件类型 TypeScript 2.8 引入了有条件类型,这是类型系统的强大令人兴奋的补充。 有条件类型使咱们可以表达均匀类型映射,即,根据条件不同的类型转换。...有条件类型中的类型推断 有条件类型支持的另一个有用特性是使用新的infer关键字推断类型变量。...在有条件类型的extends子句中,可以使用新的infer关键字推断类型变量,从而有效地执行类型上的模式匹配 type First = T extends [infer U, ...unknown...它使用infer关键字推断函数类型的返回类型: type ReturnType = T extends (...args: any[]) => infer R ?...InstanceType InstanceType类型提取构造函数类型的返回类型,它相当于构造函数的ReturnType。

2.5K20

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

,因为 TypeScript 会基于 return 语句推断函数返回值的类型。...当一个函数出现在某个地方,且 TypeScript 可以推断它是如何被调用的时候,该函数的参数会被自动分配类型。...}); 即使这里没有给参数 s 添加类型注解,TypeScript可以基于 forEach 函数类型,以及对于 name 数组类型推断决定 s 的类型。...接口的所有特性几乎都可以类型别名中使用。两者关键的区别在于类型别名无法再次“打开”并添加新的属性,接口总是可以拓展的。...toFixed()); } 和其它的类型断言一样,值断言也不会改变代码的运行时行为,所以切记:仅在你确定某个值不可能为 null 或者 undefined 的时候,才去使用 !。

2.2K20

什么是鸭子🦆类型

为什么需要鸭子类型 在一些动态语言中,鸭子类型的常见用法就是假设给定值符合我们预期的,你可以先尝试执行一个操作,然后我们再去处理不符合预期的情况下的异常。...is 关键字,这在 TypeScript 中被叫做类型谓词(type predicates),类型谓词是一个返回布尔值的函数可以用来做类型保护; 类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内...用法示例 recursiveResolve 鸭子类型的一个方便用法是当你的代码可能接受 Promise 或者 Promise 时帮我们进行更优雅的判断。...然后我们就可以在 recursiveResolve 函数使用它们了,并且开销是很小的,在整个函数中都能正确推断输入。...小技巧 - 通用类型保护 上面的判断可能在我们的代码中是个很常见的用法,如果我们需要判断的类型有很多,为每个类型都实现一个这样的类型保护函数还挺麻烦的,所以我们可以稍微做个变形封装一个更通用的类型保护函数

2K20

TS 进阶 - 类型基础

ReadonlyArray 不是 Array # type 与 interface 虽然 type 也可以代替 interface 描述对象,但更推荐用 interface 描述对象、类的结构,类型别名用来将一个函数签名...(对应字符串字面量类型那种) 可以使用 {} 作为类型签名,一个内部无属性定义的对象,类似于 Object,接受任何 null 和 undefined 的值 const tmp1: {} = undefined...此时,可以使用私有构造函数来组织其被错误的实例化,如在创建 Utils 类时,其内部都是静态成员。...,不是通过 new 实现,可以使用私有构造函数。...断言是类型断言的简化,标记前面的一个声明一定是非的,即剔除 null 和 undefined 类型: declare const foo: { func?

1.7K50

TypeScript 官方手册翻译计划【三】:类型收缩

可以理解几种不同的用于收缩类型构造。...(后者的优势在于,TypeScript 可以将其推断为一个更具体的字面量布尔类型 true,前者只能被推断为 boolean) // 下面的结果都是 true Boolean("hello"); /...我们这里刚好遇到了一个场景,那就是我们掌握的关于这个值的信息比类型检查器要多。因此,这里可以使用一个值断言(给 shape.radius 添加后缀 !)表明 radius 一定是存在的。...我们不得不给类型检查器添加大量的值断言(!),让它确信 shape.radius 已经被定义好了,但如果把代码移除,这些断言就很容易造成错误。...同理,这种检查也可以用于 switch 语句中。现在我们可以编写一个完整的 getArea 函数了,而且它没有任何麻烦的 ! 值断言符号。

2K20

语法-类型注解

# TypeScript 基础语法 TypeScript 程序由以下几个部分组成: 模块 函数 变量 语句和表达式 注释 # 第一个 TypeScript 程序 我们可以使用以下 TypeScript...; console.log(hello); 最后我们使用 node 命令执行该 js 代码。...2、引用数据类型(Reference Data Types),存储多个值、或复杂对象数据类型,比如 object 咱们介绍 5 种原始数据类型typeScript 中的应用 Boolean 布尔值...String 文本类型 Number 数字 Array 数组 Null 和 Undefined 和未定义 在定义类似时,通过 : 声明数据类型,如: 定义一个布尔值 let a: string...例如: result = 42; // 保存数字类型的值 result = "Hello"; // 保存字符串类型的值 使用联合类型,在类型声明中将这两种类型联合起来,表示该变量可以是其中任意一种类型

15520
领券