前端TS高阶篇

本次一共推出三篇文章,TS基础篇、TS高阶篇、TS习题篇,三篇文章均已发布。

语法篇

1. 联合类型的问题

interface a1{kind:'circle' | 'square'rad?:numberside?:number
}function getAre(a:a1){// return a.rad*3   //此处报错,因为 rad 为可选参数,可能未定义return a.rad!*3     //加上 ! 解决该问题,表示类型推断排除null、undefined,// 即只有类型推断不为null、undefined,我们才进行后面的步骤
}// 上面虽然解决了这个问题,但是解决方法有点不太恰当,因为参数a可能是未传参数,
// 这在ts中虽然不会引起错误,但在js中可能会引起报错// 最好的解决方法是分别定义数据类型
// 如下所示
// interface Circle {
//   kind: 'circle'
//   radius: number
// }// interface Square {
//   kind: 'square'
//   sideLength: number
// }// type Shape = Circle | Square // function getArea(shape: Shape) {
//   switch(shape.kind) {
//     case 'circle':
//       return Math.PI * shape.radius ** 2//     case 'square':
//       return shape.sideLength ** 2
//   }
// }// TS中的!和?用法// 1. 属性或参数中使用 ?:表示该属性或参数为可选项// 2. 属性或参数中使用 !:表示强制解析(告诉typescript编译器,这里一定有值),常用于vue-decorator中的@Prop// 3. 变量后使用 !:表示类型推断排除null、undefined

2. 类型守卫

所谓类型守卫,就是当一个变量或参数同时具有多种类型时,但我们只想针对于其中某一种类型进行运算

例如使用 typeof 来判断数据类型,即可实现在特定类型做特定运算

2.1. typeof 关键字
function print(str: number | string[] |null){if(typeof str === 'string'){// 当类型为 string 时进行相应运算}else if(typeof str === 'object'){// 当类型为 object 时进行相应运算// 但此处要注意,null的类型也为object,如果想避免 null 可加上 && 运算符// 即 (str && typeof str === 'object') 因为 null 在if判断后为false,故可直接写入// 当然,如果不嫌麻烦 (str !== null && typeof str === 'object'),这样也是可以的}else{}
}
2.2. 真值缩小
// 我们需要知道,下面这些值在 if() 中,结果必定为false,反之为true
// {
//     0
//     NaN
//     ""  (空字符串)
//     0n  (bigint零的版本)
//     null
//     undefined
// }function demo13(x: number | undefined){if(!x){return x}else{console.log(x+1)}
}
demo13(3)
demo13(undefined)// 上面,我们使用 !取反,如果为 undefined 就 return,否则输出x+1
2.3. 等值缩小
function demo14(x:string | number, y: string | boolean){if(x===y){// 此处的if判断很巧妙,因为两个参数身上都有共同的一个属性 string// 所以只有当两者都为 string 类型时才有可能相等,故可以在此处调用 string 身上的方法x.toUpperCase()y.toLocaleLowerCase()}
}function demo15(x:null | number | undefined){if(x != null){console.log(x+1)}// 这里需要注意:我们虽然只做了 x != null 这一个判断,也就是说 x 还有可能为undefined// 那为什么我们在下面进行加法运算,这里不会报错?这是因为我们用的是 != 即宽松的不等于判断,// 这个宽松的不等于判断可以同时排除 null 和 undefined 两个值// 但是如果用的是 x !== null ,这样就只能排除 null 一个值
}
demo15(1)
demo15(undefined)
2.4. in操作符类型缩小
type a={swim:()=>void
}type b={fly:()=>void
}
type c={swim?:()=>void,     //加上 ? 表示该参数为可选参数fly:()=>void
}
function demo16(x:a|b){if('swim' in x){return x.swim()}// 这个in操作符的作用就是判断值是否在某个东西身上,是则返回true,否则为false// 所以上面代码表示为:'swim' 是否在 x 身上,如果在,那x必定为 type所定义的类型 a// 故可以调用 swim()方法
}function demo17(x:a|b|c){if('swim' in x){// return x.swim()  报错// 因为加入了类型 c,且类型c身上是有 swim() 方法的,这样本身是没问题的// 但是c身上的 swim() 方法是可选的,也就是说可能为空,所以说会报错return (x as a).swim()// 我们加上类型断言便可解决这个问题,即只有当 x 类型为 a 时,才会去调用 swim() 方法}
}
2.5. instance操作符缩小
function demo18(x: Date | string){if(x instanceof Date){// 判断 x 是否存在 Date 这么一个方法console.log('123')}else{console.log(x.toLocaleUpperCase())}
}demo18(new Date())
demo18('hello')
2.6. 分配缩小
let x3=Math.random() < 0.5 ? 10 : 'hello'
x3=1
console.log(x3)
x3='dd'
console.log(x3)
// x3=true      //报错,因为变量x3并不具有 bool 类型// 分配类型缩小和 let x3:string | number 类似,只是他不是
// 直接告诉变量他所拥有的类型,而是通过判断来给变量进行赋值
// 这样通过类型推断,从而获取拥有到数据类型.// 这里需要注意的是,仅管我们是通过判断来给变量进行赋值,但是
// 我们也可以拥有所有的变量类型
2.7. 控制流分析
function demo19(){let x:string | number | booleanx=Math.random() < 0.5console.log(x)if(Math.random()<0.5){x='hello'   //把类型限制为 stringconsole.log(x)}else{x=100       //把类型限制为 numberconsole.log(x)}// 通过上面的操作,成功将返回值 x 类型限制为 string | numberreturn x// 这里需要注意了,这里虽然是判断,也就是说只会有一种类型成立,// 但是我们是可以同时拥有这两种数据类型的,和上一节分配缩小是一样的
}let x4=demo19()
x4='hello'
x4=100
// x4=true  //报错
2.8. 类型谓词
type Fish={name:stringswim:()=>void
}type Bird={name:stringfly:()=>void
}
// 类型谓词是用来限制返回值的数据类型
// 类型谓词书写格式:参数 is 类型    
// is是固定不变的,is左侧必须为函数本身所使用的一个参数
// is右侧必须为一个数据类型
function demo20( pet: Fish | Bird):pet is Fish{// return true      //返回值为 true 则为 Fish 数据类型// return false     //返回值为 false 则为 Bird 数据类型return (pet as Fish).swim !== undefined// 易错点:这里我们很容易就写成 pet.swim !== undefined 这是不对的// 因为 pet 可能为 Bird 数据类型,而Bird数据类型没有 swim 这个方法,ts便会提示报错// 我们需要加一个类型断言 (pet as Fish) 即代表只有当 pet 数据类型为Fish时,我们才进行接下来的操作
}

3. 类型断言

TypeScript 的类型断言(Type Assertions)是开发者向编译器表明某个值的特定类型的一种方式。类型断言允许你更具体地说明某个值的类型,而不必等待编译器的自动推断。类型断言不会在运行时产生任何影响,仅用于编译阶段的类型检查

3.1. 语法

TypeScript 提供了两种类型断言的语法:

  1. 尖括号语法(Angle-bracket syntax)
  2. as 语法
// 尖括号语法类似于在值的前面加上类型
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).len

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cyber Weekly #16

赛博新闻 1、OpenAI 发布 GPT-4o mini OpenAI 本周官宣推出 GPT-4o mini&#xff0c;这是 GPT-4o 更小参数量的简化版本。ChatGPT 的免费用户、Plus 用户和 Team 用户能使用 GPT-4o mini 而并非 GPT-3.5 Turbo&#xff0c;企业用户在下周也将获得 GPT-4o mini 的权限。GPT-4o…

少儿编程启蒙宝典:Scratch动画游戏108变

一、编程教育的时代价值与意义 随着数字时代的深入发展&#xff0c;社会对人才的需求正发生深刻变革&#xff0c;计算思维与编程能力已成为衡量个人竞争力的重要指标。在此背景下&#xff0c;培养孩子们运用计算思维解决实际问题的能力&#xff0c;成为教育领域的重要任务。编…

UE4-获得角色控制权的两种方法

方法一&#xff1a; 方法二&#xff1a; 注意此方法不能有多个玩家出生点&#xff0c;如果有多个玩家出生点&#xff0c;会随机的选择一个玩家出生点进行生成。

IP5306移动电源DIY

最近制作一款移动电源&#xff0c;芯片采用的是IP5306

JavaScript 如何判断 URL 是否合法

目录 一、使用正则表达式验证 URL&#xff1a; 二、利用HTML5的URL对象 三、使用元素判断URL 四、最靠谱方法 一、使用正则表达式验证 URL&#xff1a; function isValidUrl(url) {const regex /^(https?:\/\/)?([\da-z\.-])\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;return…

UDP详细总结

UDP协议特点 UDP是无连接的传输层协议&#xff1b; UDP使用尽最大努力交付&#xff0c;不保证可靠交付&#xff1b; UDP是面向报文的&#xff0c;对应用层交下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;保留原报文的边界&#xff1b; UDP没有拥塞控制&#…

python实现图像对比度增强算法

python实现直方图均衡化、自适应直方图均衡化、连接组件标记算法 1.直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 2.自适应直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 3.连接组件标记算法详解算法步骤8连通与4连通公式Python 实现详细解释优缺…

微服务实现全链路灰度发布

一、实现步骤 再请求 Header 中打上标签&#xff0c;例如再 Header 中添加 "gray-tag: true" &#xff0c;其表示要进行灰度测试&#xff08;访问灰度服务&#xff09;&#xff0c;而其他则访问正式服务。在负载均衡器 Spring Cloud LoadBalancer 中&#xff0c;拿到…

Deepin系统,中盛科技温湿度模块读温度纯c程序(备份)

#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <termios.h>int main() {int fd;struct termios options;// 打开串口设备fd open("/dev/ttyMP0", O_RDWR | O_NOCTTY|O_NDELAY); //O_NDELAY:打开设备不阻塞//O_NOCTT…

Qt Creator配置以及使用Valgrind - 检测内存泄露

Qt Creator配置以及使用Valgrind - 检测内存泄露 引言一、下载安装1.1 下载源码1.2 安装 二、配置使用2.1 Qt Creator配置2.2 使用2.3 更多详细信息可参考官方文档&#xff1a; 三、参考链接 引言 Valgrind是一个在Linux平台下广泛使用的开源动态分析工具&#xff0c;它提供了一…

7Python的Pandas:基础操作

Pandas 是一个强大的 Python 数据分析工具库&#xff0c;它提供了许多便利的数据结构和数据操作方法。以下是一些常见的 Pandas 基础操作&#xff1a; 导入 Pandas 库&#xff1a; import pandas as pd创建 DataFrame&#xff1a; data {Name: [Alice, Bob, Charlie], Age: [2…

开启你的 Django 开发之旅:从环境搭建到服务部署

欢迎来到这个关于如何使用 Django、MySQL、HTML、CSS、Bootstrap、jQuery 和 ECharts 构建一个全栈 Web 应用的指南。在这个博客中&#xff0c;我们将从零开始&#xff0c;一步步地搭建开发环境&#xff0c;并最终将服务部署到 Linux 系统上。 本篇进介绍大概得步骤&am…

任务2:python+InternStudio 关卡

任务地址 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Python/task.md 文档 https://github.com/InternLM/Tutorial/tree/camp3/docs/L0/Python 任务 Python实现wordcount import re import collectionstext """ Got this panda plush to…

【机器学习】智能驱动未来:机器学习在能源效率提升与环境管理中的创新应用

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习能源环境领域的应用潜力&#x1f304;能源效率提升&#x1f3de;️环境管理⛰️具体案例…

Linux之旅:常用的指令,热键和权限管理

目录 前言 1. Linux指令 &#xff08;1&#xff09; ls &#xff08;2&#xff09; pwd 和 cd &#xff08;3&#xff09;touch 和 mkdir &#xff08;4&#xff09; rmdir 和 rm &#xff08;5&#xff09;cp &#xff08;6&#xff09;mv &#xff08;7&#xff09;…

开发工具推荐:await-to-js

目录 前言&#xff1a; 1. .then().catch() 2. async await 3. await-to-js 前言&#xff1a; 今天给大家推荐一块我觉得用着还不错的工具&#xff0c;await-to-js&#xff1b; await-to-js - npm GitHub - scopsy/await-to-js: Async await wrapper for easy error ha…

HTML+CSS+JS精美气泡提示框

源代码在效果图后面 点赞❤️关注&#x1f49b;收藏⭐️ 主要实现&#xff1a;提示框出现和消失两种丝滑动画 弹出气泡提示框后延迟2秒自动消失 效果图 错误框 正确 警告 提示 源代码 <!DOCTYPE html> <html lang"en"> <head><meta cha…

PHP场地预约共享茶室棋牌室小程序系统源码

&#x1f375;&#x1f3b2;【聚会新宠】场地预约神器&#xff0c;共享茶室棋牌室小程序大揭秘&#xff01;&#x1f389; &#x1f3e1;【开篇&#xff1a;告别繁琐&#xff0c;聚会新选择】&#x1f3e1; 还在为找不到合适的聚会场地而烦恼吗&#xff1f;想要一个既私密又舒…

【如何在Python中插入列表元素】

在Python中&#xff0c;插入列表元素可以通过多种方式实现&#xff0c;具体取决于你想要将元素插入到列表的哪个位置。以下是一些常用的方法&#xff1a; 1. 使用append()方法 append()方法用于在列表的末尾添加一个元素。这是插入元素到列表中最简单的方式。 my_list [1, …

JS 原型与原型链图解:彻底搞懂的终极指南

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 在JavaScript中&#xff0c;原型和原型链是非常重要的知识点&#xff0c;只有理解了…