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

Typescript 一些令人又爱又恨内容 — Type Guard、Narrowing

不晓得大家在利用 TypeScript 进行开发时,有没有觉得 TypeScript检查类型这块特别恼人,虽然知道这些类型检查举动是非常好,可以帮助我们减少许多可能会发生潜在错误,今天就要来谈谈当我们在开发上遇到这种问题时该如何解决...场景一 不晓得大家有没有遇过这种问题,今天想要让这个变量查看是否符合 enum 中某一个值,结果 TypeScript 就喷错给你看了,像下面这样。...这样写看起来的确没有什麽问题,我们想要结果也类型收窄变成了类型转换,但这样做其实就有点不太符合 Type Guard 精神,毕竟 Type Guard 要做类型检查而不是类型转换,而且假如我们要做类型转换...T] | undefined => { return value === null ?...总结 今天介绍了 TypeScript 中用来检查类型方法,假如读者日后遇到类似这种问题不妨可以多加利用 Type Guard 进行检查,而不是直接开大绝用 @ts-ignore 或者 as 这两种方法

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

TypeScript 中使用类型守卫 5 种方式,你都知道吗

类型守卫是一种TypeScript技术,用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值常规函数,接受一个类型并告诉TypeScript是否可以缩小到更具体类型。...instanceof 类型守卫 Instanceof是一个内置类型守卫,可用于检查一个值是否是给定构造函数或类实例。...in类型守卫检查对象是否具有特定属性,并使用该属性区分不同类型。...在这种情况下,Typescript把它缩小到字符串。如果没有收缩,a类型仍然不明确,因为它可以是数字或字符串。 带有谓词自定义类型守卫 创建一个自定义类型守卫通常是使用类型守卫强大选项。...结尾 TypeScript类型守卫有助于确保类型值,改善整体代码。在本文中,我们回顾了TypeScript中几个最有用类型守卫,并通过几个例子来了解它们实际应用。

2K30

TypeScript 非空断言

有没有更简单方式呢?...; } 二、非空断言操作符简介 在上下文中当类型检查器无法断定类型时,一个新后缀表达式操作符 ! 可以用于断言操作对象是非 null 和非undefined 类型。具体而言,x!...(); //OK } 2.3 使用非空断言操作符注意事项 因为 ! 非空断言操作符会编译生成 JavaScript 代码中移除,所以在实际使用过程中,要特别注意。...; 语句可以通过 TypeScript 类型检查检查。但在生成 ES5 代码中,! 非空断言操作符被移除了,所以在浏览器中执行以上代码,在控制台会输出 undefined。...需要注意是,非空断言操作符仅在启用 strictNullChecks 标志时候才生效。当关闭该标志时,编译器不会检查 undefined 类型null 类型赋值。

20.1K65

TypeScript 5.3

// true console.log(undefined instanceof Weirdo); 为了在instanceof中更好地建模这种行为,TypeScript现在检查是否存在这样[Symbol.hasInstance...它实际上充当了一个名为PointLike单独类型自定义类型保护。 在函数f中,我们能够用value将PointLike缩小到instanceof,但不能缩小到Point。...TypeScript 5.3现在更仔细地检查super属性访问/方法调用,以查看它们是否对应于类字段。 如果它们这样做了,我们现在将得到一个类型检查错误。 这张支票是由Jack Works提供!...|(SomeType & Type99999NINE)联合。 当检查一个联合体是否可以赋值给某个目标类型时,我们必须检查联合体每个成员是否都可以赋值给目标类型,这可能会非常慢。...在TypeScript 5.3中,我们可以看到我们能够隐藏原始交集形式。 当我们比较类型时,我们做一个快速检查,看看目标是否存在于源交集任何组成部分中。

20210

如何在TypeScript中使用类型保护

类型保护是一种TypeScript技术,用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值常规函数,接受一个类型并告诉TypeScript是否可以缩小到更具体类型。...in类型保护检查对象是否具有特定属性,并使用该属性区分不同类型。...它用于其缩小范围,以及检查浏览器支持。 in类型保护基本语法如下: propertyName in objectName 在下面的例子中,in类型守卫检查 house 属性是否存在。...在这种情况下,Typescript把它缩小到字符串。如果没有收缩,a类型仍然不明确,因为它可以是数字或字符串。 带有谓词自定义类型保护 创建一个自定义类型守卫通常是使用类型守卫强大选项。...结尾 TypeScript类型保护有助于确保类型值,改善整体代码流。在本文中,我们回顾了TypeScript中几个最有用类型保护,并通过几个例子来了解它们实际应用。

18310

TypeScript数据类型

TypeScript原始数据类型 String Number boolean null undefined enum symbol // Number var num:number=1; /...var un:undefined=undefined; //null var nul:null=null; 无返回值类型 空值一般来说采用void表示,void可以表示变量,也可表示函数无返回值 var...同时我们也不能对void类型进行分配 TypeScript 任意值 任意值(Any)用来表示允许赋值为任意类型,声明一个变量任意值之后,对他任何操作,返回内容类型都是任意值。..., * 他等价于var num2:any; */ var num2; TypeScript类型推论 TypeScript会按照类型推论原则推论出我们类型 /** * 给变量赋值初始值时候如果没有指定类型...,那么他就会根据初始值倒推类型 * 那么说后续我们只能按照初始值类型进行赋值,当字符串2赋值给b时候他是不允许,因为类型不匹配 */ var b=1 b="2"; 如果定义时候没有赋值,不管之后有没有赋值

37510

TypeScript数据类型

TypeScript原始数据类型 String Number boolean null undefined enum symbol // Number var num:number=1; /...var un:undefined=undefined; //null var nul:null=null; 无返回值类型 空值一般来说采用void表示,void可以表示变量,也可表示函数无返回值 var..., * 他等价于var num2:any; */ var num2; TypeScript类型推论 TypeScript会按照类型推论原则推论出我们类型 /** * 给变量赋值初始值时候如果没有指定类型...,那么他就会根据初始值倒推类型 * 那么说后续我们只能按照初始值类型进行赋值,当字符串2赋值给b时候他是不允许,因为类型不匹配 */ var b=1 b="2"; 如果定义时候没有赋值,不管之后有没有赋值...,都会被推断成any类型而且完全不会被类型检查. /** * 如果没有给b赋初始值就是any类型,他等价于var b:any; */ var b; b="2"; b=true;

31500

TypeScript数据类型

TypeScript原始数据类型 String Number boolean null undefined enum symbol // Number var num:number=1; /...var un:undefined=undefined; //null var nul:null=null; 无返回值类型 空值一般来说采用void表示,void可以表示变量,也可表示函数无返回值 var..., * 他等价于var num2:any; */ var num2; TypeScript类型推论 TypeScript会按照类型推论原则推论出我们类型 /** * 给变量赋值初始值时候如果没有指定类型...,那么他就会根据初始值倒推类型 * 那么说后续我们只能按照初始值类型进行赋值,当字符串2赋值给b时候他是不允许,因为类型不匹配 */ var b=1 b="2"; 如果定义时候没有赋值,不管之后有没有赋值...,都会被推断成any类型而且完全不会被类型检查. /** * 如果没有给b赋初始值就是any类型,他等价于var b:any; */ var b; b="2"; b=true;

36630

如何处理TypeScript可选项和Undefined

什么是undefined? 在项目中设置TypeScript严格模式,将会检查代码中所有潜在问题。我建议你尽可能TypeScript更为严格(strict)。...如果你在IDE中把鼠标悬停在Foo上,你会看到TypeScript实际上已经把bar定义为number | undefined联合类型。...'. ts(2532) } 有好几种办法去解决这个问题。...但最好解决方式,与在JavaScript中解决方式相同:检查你获取值是否是你所期望TypeScript可以理解这类检查,并可以使用它们来收窄对特定代码类型检查范围(类型收窄)。...当可选链遇到undefined或者null时,就会停止求值。 实话实说,这个例子有点刻意为之。但是在JavaScript框架中,对可能尚未初始化变量进行属性访问是很常见

3.6K10

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

在 switch 语句每个 case 中,TypeScript 编译器将联合类型缩小到一个成员类型。...例如,当匹配到 "paypal",method 参数类型 PaymentMethod 缩小到 PayPal。因此,咱们可以访问 email 属性,而不必添加类型断言。...使用最少 TypeScript 语法开销,咱可以编写几乎纯 JS,并且仍然可以类型检查和代码完成中受益。...一旦控制流分析排除了 string 和 number 作为 value 类型候选项,类型检查器就推断出never 类型,这是惟一剩下可能性。...这样函数在 TypeScript 中被推断为有一个 void 返回类型。 具有 never 返回类型函数永不返回。它也不返回 undefined

1K20

TypeScript 演化史 — 第二章】基于控制流类型分析 和 只读属性

严格 Null 检查 当与可空类型一起使用时,基于控制流类型分析尤其有用,可空类型使用包括 nullundefined 在联合类型表示。...如果我们要返回全名,则需要检查 lastName 是 null 或者undefined ,以避免将字符串 "null" 或 "undefined" 附加到名字上。...在严格 null 检查模式下,undefined 类型会自动添加到可选属性联合类型中,因此我们不必显式将其写出。 明确赋值分析 基于控制流另一个新特性是明确赋值分析。...也就是说,它是类型系统另一个特性,通过让编译器 TypeScript 代码库中检查意外属性分配,帮助你编写正确代码。...也就是说,它是类型系统另一个特性,通过让编译器 TypeScript 代码库中检查意外属性分配,帮助你编写正确代码。

2K10

《现代Typescript高级教程》类型守卫

现代JavaScript高级小册 深入浅出Dart 现代TypeScript高级小册 类型守卫 概述 在 TypeScript 中,类型守卫可以用于在运行时检查变量类型,并在代码块内部将变量类型范围缩小到更具体类型...这种类型收窄可以让 TypeScript 编译器更好地理解我们代码意图,从而提供更准确类型推断和类型检查。...通过这种方式,我们能够更准确地推断和检查联合类型变量。 使用 in 操作符进行类型守卫 in 操作符可以用于在 TypeScript 中判断一个属性是否存在于对象中,从而进行类型判断和类型收窄。...,TypeScript 编译器会收窄 value 类型为 string,从而在代码块内部提供相应智能提示和类型检查。...()); } else { console.log('Value is null or empty'); } } 在上面的示例中,当条件表达式 value 结果是真值(即不为 null

26630

要改掉 10 种 TypeScript 坏习惯

通常,即使在正式类型化中也会用到 any(例如,上面示例中 response.json() 被 TypeScript 团队定义为 Promise)。 为什么应该纠正它 它基本上会禁用所有类型检查。... JavaScript 转换为 TypeScript 时,现有的代码库通常会对 TypeScript 编译器无法自动推断出类型进行假设。...= null 允许我们同时检查 nullundefined。 function createNewMessagesResponse (countOfNewMessages?...== linting 规则集都可以豁免!= null。如果代码库在 nullundefined 之间没有明显区别,则!= null 有助于简化对这两种可能性检查。...为什么应该纠正它 尽管 null 值在 JavaScript 早期很麻烦,但在 TypeScript strict 模式下,它们却可以成为这种语言工具带中宝贵成员。

49520

一文看懂any,never,void和unknown区别

any 首先给大家介绍是any类型,我相信一些JavaScript转TypeScript同学一定不会对这个类型感到陌生,因为它是我们将JavaScript代码重构为TypeScript代码银弹,...: string): any } 注意:虽然any很方便,可是我们还是需要想办法避免代码中出现any类型,这是因为any跳过了所有的类型检查,而这会给我们带来一些潜在安全问题。...void void其实可以理解为nullundefined联合类型,它表示空值。...用法 我们一般不会声明某个值类型为void,因为它表示这个值只能是undefined或者null(strictNullChecks没被指定): let vVoid: void = undefined...void表示空值,也就是null或者undefined,而never则表示永远都不会出现值。

75030

TypeScript 5.4:带来新类型和一些 Break Change

中是一个常见类型推断过程,基于我们可能进行某些检查或条件,TypeScript 能够自动推断出变量具体类型,这就使得该变量类型范围被“缩小”或者说“窄化”。...因此,TypeScript 5.4 做了改进,当参数和 let 变量在非提升函数中使用时,类型检查器将查找最后一个赋值点。...如果找到一个,TypeScript 可以包含该函数外部安全地窄化,那上面的代码示例就可以正常工作了。 但是还需要注意一点,如果我们是在嵌套函数中任何地方对变量进行了赋值,类型收窄还是不起作用。...在 TypeScript 早期版本中,当我们使用条件类型(就是那种基于条件分支决定类型表达式)时,默认行为有时会显得有些草率。...这样有时会允许一些在逻辑上应该出错代码通过类型检查。 而在新版 TypeScript 5.4 中,类型系统变得更加严谨和精确了。

23310

TypeScript 演化史 — 第一章】non-nullable 类型

在这篇文章中,我们将讨论发布于 TypeScript 2.0 中 non-nullable 类型,这是对类型系统一个重大改进,该特性可对 nullundefined 检查。...nullundefined 值 在 TypeScript 2.0 之前,类型检查器认为 nullundefined 是每种类型有效值。...严格Null检查 TypeScript 2.0 增加了对 non-nullable 类型支持,并新增严格 null 检查模式,可以通过在命令行上使用 ——strictNullChecks 标志来选择进入该模式...如果咱们在编译前时启用了严格 null 检查,如果将 nullundefined 分配给任何变量都会导致类型错误 // 使用 --strictNullChecks 编译 let name:...用联合类型构建可空性 由于在启用严格 null 检查时,类型在默认情况下是不可空,所以我们需要显式指定可为空,并告诉类型检查器我们希望哪些变量为空。

2.4K20
领券