当前位置: 首页 > news >正文

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.helloJavalang.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;
}
  1. isJava 是一个函数名,用于表示这个类型谓词函数。
  2. (lang: Java | JavaScript) 表示函数接受一个参数 lang,它的类型可以是 Java 或 JavaScript。
  3. lang is Java 是类型谓词部分,用于指定返回值的类型。这里表示当条件满足时,lang 的类型被断言为 Java 类型。
  4. 在函数体内部,(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;
}
http://www.lryc.cn/news/292101.html

相关文章:

  • Vulnhub-RIPPER: 1渗透
  • 幻兽帕鲁自建服务器:可以使用香港服务器吗?
  • Revisiting image pyramid structure for high resolution salient object detection
  • 中移(苏州)软件技术有限公司面试问题与解答(7)—— kmalloc与vmalloc的区别与联系及使用场景
  • 微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)
  • 后端性能优化的一些总结
  • 【升级openssl1.1.1t报错libssl.so.1.1: cannot open shared object file】
  • CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析
  • JAVA处理类似饼状图占比和100%问题,采用最大余额法
  • MATLAB矩阵的操作(第一部分)
  • 全面掌握Django的web框架Django Rest_Framework(一)
  • AOP+Redisson 延时队列,实现缓存延时双删策略
  • Hive中left join 中的where 和 on的区别
  • LaTeX教程(001)-LaTeX文档结构(01)
  • SV-7041T 多媒体教学广播IP网络有源音箱
  • Linux文本三剑客awk经典案例
  • 如何使用 Mermaid、GitHub 和 VSCode 用代码创建关系图三
  • 考研经验总结——政治篇
  • 春招秋招,在线测评到底难不难?
  • 数学建模比赛中,使用大语言模型如chatgpt、文心一言该如何写Prompt(提示)?
  • tcpdump 抓包无法落盘
  • 【网站项目】066农家乐信息平台
  • idea/webstorm 创建Vue实例 Unresolved type Vue 处理方法
  • C++ 11新特性之语法甜点2
  • 【芯片设计- RTL 数字逻辑设计入门 番外篇 8.1 -- memory repair 详细介绍】
  • 2023强网杯复现
  • IP代理协议有哪些?爬虫代理如何被合理使用?
  • Vue学习笔记(二)快速入门
  • 在Vue中@click方法不起效
  • 服装行业ERP系统解决方案