首页 > 其他分享 >14. TypeScript类型保护(类型缩小、类型守卫)

14. TypeScript类型保护(类型缩小、类型守卫)

时间:2024-04-09 13:30:35浏览次数:33  
标签:swim TypeScript 14 pet Fish 类型 undefined

类型保护是一种TypeScript技术,用于获取变量类型信息,通常使用在条件块语句中。 类型守卫是返回布尔值的常规函数,接受一个类型并告诉TypeScript是否可以缩小到更具体的类型。

TypeScript类型保护的方式

类型断言

类型断言是一种告诉编译器“相信我,我知道我在做什么”的方式。它不进行特殊的数据检查和解构。它没有运行时的影响,只是在编译阶段起作用。TypeScript假设你,程序员,已经进行了必要的检查。

let someValue: any = "this is a string";
// 使用类型断言来告诉编译器someValue是一个字符串
let strLength: number = (<string>someValue).length;

类型谓词

类型谓词是一种特殊的返回值为 arg is T 的函数,其中 arg 是当前函数的一个参数,T 是任意类型。这种类型谓词的使用可以帮助TypeScript更好地理解代码的逻辑。

function isFish(pet: Fish | Bird): pet is Fish {
    // 如果pet有swim属性,那么它就是Fish类型
    return (pet as Fish).swim !== undefined;
}

instanceof关键字

instanceof关键字是JavaScript的一个标准操作符,TypeScript在类型保护中也支持它。

if (pet instanceof Fish) {
    // 如果pet是Fish类型,那么我们可以调用swim方法
    pet.swim();
}

in关键字

in操作符可以用来检查一个对象是否具有某个属性。在类型保护中,我们可以使用in操作符来区分一个联合类型的不同类型。

function move(pet: Fish | Bird) {
    if ("swim" in pet) {
        // 如果pet有swim属性,那么它就是Fish类型
        return pet.swim();
    }
    return pet.fly();
}

用户自定义的类型保护

用户可以通过创建自己的类型保护函数来创建自定义的类型保护。

function isNumber(x: any): x is number {
    // 如果x的类型是number,那么返回true
    return typeof x === "number";
}

typeof关键字

typeof关键字在JavaScript中用于获取一个变量或表达式的类型。在TypeScript中,当我们需要区分函数、字符串、数字或布尔值等基本类型时,可以使用typeof关键字。

if (typeof pet === "string") {
    // 如果pet是字符串类型,那么我们可以调用trim方法
    console.log(pet.trim());
}

nullundefined检查

在TypeScript中,我们可以使用nullundefined来进行类型保护。这在处理可能为nullundefined的值时非常有用。

function printLength(str: string | null | undefined) {
    if (str !== null && str !== undefined) {
        // 如果str不是null或undefined,那么我们可以获取它的长度
        console.log(str.length);
    }
}

类型保护可以帮助我们在编译阶段发现可能的错误,提高代码的健壮性和可读性。然而,它也有一些局限性,例如,过度的类型保护可能会使代码变得复杂和难以理解。

标签:swim,TypeScript,14,pet,Fish,类型,undefined
From: https://blog.csdn.net/imdeity/article/details/137545094

相关文章

  • [ARC147E] Examination
    2023年集训队论文《浅谈一些二分图匹配相关问题》的例题。感觉看完论文以后做起来行云流水,但是自己想应该是想不出来,所以还是记录一下。以下都是瞎扯。拆解问题,乍一看不存在好的策略,但是我们知道\(A_i<B_i\)的部分一定要换,而剩下的部分要求我们自行抉择。因为要求我们自己决......
  • 冒泡排序的基本实现【数据结构与算法—TypeScript 实现】
    笔记整理自coderwhy『TypeScript高阶数据结构与算法』课程概念本质:相邻元素两两比较并交换位置,使整个序列按照特定的顺序排列特性复杂度分析时间复杂度:最好情况:O(n)最坏情况:O(n^2)平均情况:O(n^2)空间复杂度:O(1),原地排序使用场景因为时间复杂度为O(n^2)适......
  • 优先队列的基本实现【数据结构与算法—TypeScript 实现】
    笔记整理自coderwhy『TypeScript高阶数据结构与算法』课程特性效率比普通队列高每个出队元素拥有最高优先级可以用数组、链表等数据结构实现,但是堆结构是最常用的实现方式设计实现方式:基于堆结构实现,堆结构底层基于数组实现属性:heap:存放队列元素方法:enq......
  • 插入排序的基本实现【数据结构与算法—TypeScript 实现】
    笔记整理自coderwhy『TypeScript高阶数据结构与算法』课程概念本质:将数列分为已排序和未排序,将未排序中的元素插入到已排序中的合适位置特性复杂度分析时间复杂度:最好情况:O(n),有序序列最坏情况:O(n^2),倒序序列平均情况:O(n^2),随机数列空间复杂度:O(n),原地排序使......
  • 选择排序的基本实现【数据结构与算法—TypeScript 实现】
    笔记整理自coderwhy『TypeScript高阶数据结构与算法』课程概念本质:两两元素相比较,先扫描一遍未排序数列,把未排序的数列中的最小(大)元素,放到数列的已排序的末尾特性选择排序是冒泡排序的优化版本,主要优化了交换的过程在所有完全依靠交换去移动元素的排序方法中,选择排......
  • TensorFlow2数据类型
    1.1数值类型数值类型的张量是TensorFlow的主要数据载体,分为:1.标量(Scalar)单个的实数,如1.2,3.4等,维度数(Dimension,也叫秩)为0,shape为[]2.向量(Vector)n个实数的有序集合,通过中括号包裹,如[1.2],[1.2,3.4]等,维度数为1,长度不定,shape为[......
  • 瀚高数据库获取数据表结构(字段名,字段类型,字段长度,是否为空,描述 )SQL语句
    瀚高数据库获取数据表结构(字段名,字段类型,字段长度,是否为空,描述)SQL语句SELECTc.column_nameas"字段",c.data_typeas"字段类型",c.character_maximum_lengthas"字段长度",c.is_nullableas"是否为NULL",t.descriptionas"注释"F......
  • 蓝桥杯2014国A-排列序数(待续)
    [蓝桥杯2014国A]排列序数题目描述如果用abcd这\(4\)个字母组成一个串,有\(4!=24\)种,如果把它们排个序,每个串都对应一个序号:abcd0abdc1acbd2acdb3adbc4adcb5bacd6badc7bcad8bcda9bdac10bdca11cabd......
  • Android14音频进阶之<进阶调试>:Perfetto定位系统音频问题(六十六)
    简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】......
  • C#开发的绑定类型默认应用例子 - 开源研究系列文章
          这次在用C#编写一个看图软件小工具,然后其它的基本完成了,就是绑定看图软件到那些个图片扩展名的时候碰到了问题,就是如何将看图软件绑定图片文件的默认应用,以及解绑默认应用。这个涉及到注册表操作,但是找度娘和AI回答,都没得到良好的回复。于是就根据AI的提示,自己研究了......