17 # 类型检查机制:类型保护
例子:
enum Type {Strong,Week
}class Java {helloJava(){console.log('hello Java');}
}class JavaScript {helloJavaScript(){console.log('hello JavaScript');}
}function getLanguage(type: Type){let lang = type === Type.Strong ? new Java() : new JavaScript();if(lang.helloJava) {lang.helloJava();} else {lang.helloJavaScript();}return lang;
}
上面的 lang.helloJava 跟 lang.helloJavaScript 会报错,因为 lang 是个联合类型,TypeScript 不能确定 lang 是什么类型。
需要加上类型断言:
function getLanguage(type: Type){let lang = type === Type.Strong ? new Java() : new JavaScript();if((lang as Java).helloJava) {(lang as Java).helloJava();} else {(lang as JavaScript).helloJavaScript();}return lang;
}
但是这种方案需要在每处都加,代码可读性差。而类型保护就是用来解决这个问题的。它可以提前对类型做出预判。
类型保护
TypeScript 能够在特定的区块中保证变量属于某种确定的类型。
可以在此区块中放心地引用此类型的属性,或者调用此类型的方法。
创建区块的 4 中方法:
1、instanceof
判断某个实例是不是属于某个类:
function getLanguage(type: Type){let lang = type === Type.Strong ? new Java() : new JavaScript();if(lang instanceof Java) {lang.helloJava();} else {lang.helloJavaScript();}return lang;
}
2、in
判断某个属性是否属于某个对象:
enum Type {Strong,Week
}class Java {helloJava(){console.log('hello Java');}java: any
}class JavaScript {helloJavaScript(){console.log('hello JavaScript');}javascript: any
}function getLanguage(type: Type){let lang = type === Type.Strong ? new Java() : new JavaScript();if('java' in lang) {lang.helloJava()} else {lang.helloJavaScript();}return lang;
}
3、typeof
判断某个变量的基本类型:
function getLanguage(type: Type, x: string | number){let lang = type === Type.Strong ? new Java() : new JavaScript();if(typeof x === 'string') {x.length} else {x.toFixed(2);}return lang;
}
4、创建类型保护函数来判断对象的类型
创建一个类型谓词函数,用于在 TypeScript 中判断一个变量的类型是否为 Java:
function isJava(lang: Java | JavaScript): lang is Java {return (lang as Java).helloJava !== undefined;
}
- isJava 是一个函数名,用于表示这个类型谓词函数。
(lang: Java | JavaScript)表示函数接受一个参数 lang,它的类型可以是 Java 或 JavaScript。lang is Java是类型谓词部分,用于指定返回值的类型。这里表示当条件满足时,lang 的类型被断言为 Java 类型。- 在函数体内部,
(lang as Java).helloJava使用类型断言将 lang 断言为 Java 类型,并检查断言后的对象是否具有 helloJava 属性。如果有,则返回 true,表示 lang 是 Java 类型;否则返回 false。
enum Type {Strong,Week
}class Java {helloJava(){console.log('hello Java');}java: any
}class JavaScript {helloJavaScript(){console.log('hello JavaScript');}javascript: any
}function isJava(lang: Java | JavaScript): lang is Java {return (lang as Java).helloJava !== undefined;
}function getLanguage(type: Type, x: string | number){let lang = type === Type.Strong ? new Java() : new JavaScript();if(isJava(lang)) {lang.helloJava();} else {lang.helloJavaScript();}return lang;
}
相关文章:
17 # 类型检查机制:类型保护
例子: enum Type {Strong,Week }class Java {helloJava(){console.log(hello Java);} }class JavaScript {helloJavaScript(){console.log(hello JavaScript);} }function getLanguage(type: Type){let lang type Type.Strong ? new Java() : new JavaScript();…...
Vulnhub-RIPPER: 1渗透
文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、rips的使用三、获取密码文件四、日志审查五、提权 一、前言 由于在做靶机的时候,涉及到的渗透思路是非常的广泛,所以在写文章的时候都是挑重点来写,尽量的不饶…...
幻兽帕鲁自建服务器:可以使用香港服务器吗?
随着网络技术的发展,越来越多的游戏爱好者选择通过自建服务器来享受游戏的乐趣。幻兽帕鲁作为一款备受喜爱的游戏,也有不少玩家想要自建服务器进行游戏。而在选择服务器地点时,很多玩家会想到使用香港服务器。那么,是否可以使用香…...
Revisiting image pyramid structure for high resolution salient object detection
accv2022的技术,在我测评的数据集上确实要明显好于basnet,rembg等一众方法。 1.Introduction 使用LR数据集训练的方法通过调整输入尺寸可以在HR图像上产生不错的结果。本文主要关注仅使用LR数据集进行训练以产生高质量的HR预测。HR的有效感受野ERFs和LR…...
中移(苏州)软件技术有限公司面试问题与解答(7)—— kmalloc与vmalloc的区别与联系及使用场景
接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文参考以下文章: kmalloc与vmalloc如何选择 Vmalloc与kmalloc的区别 特此致谢! 本文对于中移…...
微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)
客户端流程 客户端心跳与实例往服务端注册...
后端性能优化的一些总结
目录 1、背景 2、优化实现 2.1查询数据表速度慢 2.2调别人接口速度慢 2.3导入速度慢、 2.4导出速度慢的做出介绍 2.5统计功能速度慢 3、总结 1、背景 系统上线后,被用户反应系统很多功能响应时长很慢。用户页面影响速度有要求,下面针对查询数据表…...
【升级openssl1.1.1t报错libssl.so.1.1: cannot open shared object file】
升级openssl报错: openssl vesion openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 编译安装openssl1.1.1t当执行openssl version的时候,报上述错误,将编译到的…...
CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析
本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案,开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞,该漏洞源于文件server/application/api/contr…...
JAVA处理类似饼状图占比和100%问题,采用最大余额法
前言: 在做数据统计报表的时候,有两种方式解决占比总和达不到100%或者超过100%问题。 第一种方式是前端echart图自带的算分框架。 第二种方式是java后端取处理这个问题。 现存问题: 前端不通过饼状图的方式去展示各个分类的占比累加和为100%问…...
MATLAB矩阵的操作(第一部分)
矩阵的基本知识 矩阵概念 矩阵(Matrix)在数学中是一个由复数或实数组成的矩形阵列,其元素按照行和列排列。矩阵的定义可以形式化地描述为: 一个 m 行 n 列的矩阵是一个有序的数表,其中包含 m*n 个数,可以…...
全面掌握Django的web框架Django Rest_Framework(一)
文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置(1)DRF需要以下依赖(2)创建django项目 4.序列化器的使用(1)创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…...
AOP+Redisson 延时队列,实现缓存延时双删策略
一、缓存延时双删 关于缓存和数据库中的数据保持一致有很多种方案,但不管是单独在修改数据库之前,还是之后去删除缓存都会有一定的风险导致数据不一致。而延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式,即在删除缓存之后&…...
Hive中left join 中的where 和 on的区别
目录 一、知识点 二、测试验证 三、引申 一、知识点 left join中关于where和on条件的知识点: 多表left join 是会生成一张临时表。on后面: 一般是对left join 的右表进行条件过滤,会返回左表中的所有行,而右表中没有匹配上的数…...
LaTeX教程(001)-LaTeX文档结构(01)
LaTeX教程(001)- LaTeX \LaTeX LATEX文档结构(01) 说在前面 这是我本人学习《The LaTeX Companion》第三版的笔记,但并不是翻译。 书籍的第一章对 LaTeX \LaTeX LATEX及其历史进行了相当长的介绍,这是几乎每一本关于 LaTeX \LaTeX LATEX的书都会…...
SV-7041T 多媒体教学广播IP网络有源音箱
SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可达到功率30W。同时它可以外接一个30W的无源副音箱,用在面积较大的场所。5寸进口全频低音喇…...
Linux文本三剑客awk经典案例
前言: AWK是一种专门用于文本处理的编程语言,它被广泛用于数据提取和报告生成,也是企业笔试面试常考的内容,以下34题是awk的用法案例,希望可以帮到你! 1.查看TCP连接状态 [rootnode1 ~]# netstat -nat | a…...
如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图三
Mermaid 系列 如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图一如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图二 1.如何创建甘特图 Gantt 甘特图以条形图的形式用作可视化表示。它有效地展示了项目的时间表,揭示了各个项目组件完成所需的持续时间…...
考研经验总结——政治篇
文章目录 一、前言二、学习情况三、最后 一、前言 不要提前,不要提前,不要提前, 我曾在暑假的时候上了7天左右的政治课,讲真话是很有趣的,并且对于自身的世界观、人生观和价值观的改善也是相当不错的,把我…...
春招秋招,在线测评到底难不难?
现在很多企业在春招的时候,都会有一个在线测评的环节,目的当然就是希望更加了解清楚毕业生的综合能力以及其他方面的素质,好让HR可以根据岗位筛选出能力达标的人才。所以,现在不少即将面对春招的大学毕业生,比较关心的…...
STM32F103精英板实战:手把手教你移植开源Modbus主机库,实现稳定主从通信
STM32F103精英板实战:手把手教你移植开源Modbus主机库,实现稳定主从通信 Modbus协议作为工业自动化领域最常用的通信协议之一,其简单可靠的特性使其在各种嵌入式设备中广泛应用。对于使用STM32F103系列开发板的工程师来说,如何快速…...
深入解析BLE空口报文抓取:从GAP广播到LESC安全通信全流程
1. BLE空口报文抓取基础 想要分析BLE设备间的通信过程,抓取空口报文是最直接有效的方法。这就像在两个人对话时,用录音设备记录下他们的每一句话。不过BLE通信使用的是2.4GHz无线频段,我们无法直接用耳朵听到这些"对话",…...
RK3588部署MMPose模型踩坑实录:手把手教你解决ReduceL2算子溢出与精度丢失问题
RK3588部署MMPose模型实战:ReduceL2算子溢出问题的深度解析与手术级修复 当关键点检测模型的精度要求遇上边缘计算设备的硬件限制,RK3588平台上的MMPose部署往往会遭遇令人头疼的算子兼容性问题。其中ReduceL2算子的溢出问题尤为典型——它像一道无形的屏…...
Windows屏保设置失效?解锁注册表权限的终极指南
1. 为什么你的Windows屏保设置突然失效了? 最近有没有遇到过这种情况:明明想设置个屏保保护隐私,却发现所有选项都变成灰色不可点击?这个问题我帮不少朋友解决过,其实90%的情况都是注册表权限在作怪。Windows系统有个特…...
【stm32_2.1】【快速入门】自举模式、Flash闪存、LED点灯——对二极管PN结解析
目录 当前MCU概述 固化程序到单片机 自举模式 自举配置 Flash闪存 二极管的原理 当前MCU概述 MCU名称stm32F407ZET6处理器主频168MHz 闪存容量 512KB静态随机访问存储器SRAM192KBMCU引脚数量144pin 固化程序到单片机 写好的程序要固化到单片机,就必须学习怎…...
数字电路实战:基于Multisim的74LS161计数器设计与应用
1. 从零认识74LS161计数器 第一次接触数字电路时,看到74LS161这个编号可能会觉得头大。其实它就是个非常实用的4位二进制同步计数器芯片,就像我们生活中常见的里程表一样,能够按照固定规律进行计数。我在实验室里第一次用它做实验时ÿ…...
Mastering Text Tokenization for Large Language Models: From Words to Embeddings
1. 文本标记化的核心概念 你可能已经听说过ChatGPT这类大语言模型的神奇能力,但你知道它们是如何"读懂"人类文字的吗?秘密就藏在文本标记化(Tokenization)这个关键步骤里。想象一下,我们要教一个完全不懂中…...
OpenClaw插件开发:为Qwen3.5-4B-Claude添加Excel处理能力
OpenClaw插件开发:为Qwen3.5-4B-Claude添加Excel处理能力 1. 为什么需要开发Excel处理插件 上周我需要处理一批销售数据报表时,突然意识到一个痛点:虽然Qwen3.5-4B-Claude模型在结构化分析上表现优异,但要让它真正帮我完成Excel…...
NeoPixel Painter:嵌入式HSV动画的固定点实现
1. NeoPixel Painter 库概述NeoPixel Painter 是一个面向嵌入式 LED 动画开发的轻量级 Arduino 库,专为简化 WS2812B(NeoPixel)LED 灯带的动态效果编程而设计。它并非对 Adafruit_NeoPixel 库的简单封装,而是构建在其之上的状态驱…...
BiliTools:跨平台B站资源管理工具的全方位应用指南
BiliTools:跨平台B站资源管理工具的全方位应用指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliToo…...
