《Effective TypeScript》条款21 - 类型扩展
本文主要通过一些实际的代码示例,来帮助大家理解什么是类型扩展,本文主要内容如下:
- 什么是类型扩展
- 代码示例
- 总结
什么是类型扩展?
TypeScript 需要从你指定的单一值中决定一组可能的值,这个过程成为类型扩展
代码示例
interface Vector { x: number; y: number; z: number; }
function getComponent(vector: Vector, axis: keyof Vector) { return vector[axis]; }
当你使用它时,TypeScript会提示一个错误.
//~类型string的参数不能赋值给类型 "x"|"y"|"z"的参数
报错的原因在于,x被推断为string,而getComponent的第二个参数则是期望得到一个更加具体的单位类型。
这就是类型扩展在起作用,所以导致这里产生了一个错误。
x被推断为string,因为typescript允许这样的代码:
let x = 'x';x = 'a'; x = 'b';
typescript试图在特殊性和灵活性之间找到平衡,一般的规则是,一个变量的类型不应该在它被声明后改变,所以string 比 string|Regexp或者string|string[]或者any更合理。
TypeScript给了一些方法控制类型扩展过程,其中一种就是const,如果你用const而不是let,var来声明变量,就会得到一个更窄的类型。
const x = "x"; //x的类型为"x",而不是string;
然而const对数组和对象来说仍然无效,因为在js中,对象自身不变的情况下,对象里面的属性是可以改变的。
比如:
const v = {x:1};
v的类型可以被推断到任意程度,最具体的为:{readonly x :1},一般化的是{x:number},再一般化的就是{[key:string]:number}或者object了。
对于对象来说,Typescript 的类型扩展算法会把对象中的每个元素当作是用let赋值了,所以,const v = {x:1}
的类型 就是 {x:number};
我们可以通过Typescript 提供的方法来覆盖Typescript 的默认行为。
- 提供一个明确的类型标注
const v:{x:1|3|5} = {x:1} - 为类型检查器提供额外的上下文
通过传递值作为函数的参数 - 使用const断言
// const断言是纯粹的运行在类型空间的东西
const v1 = {x:1,y:1};//类型为{x:number,y:number}
const v2 = {x:1 as const,y:1};//类型为 {x:1,y:number}
const v3 = {x:1,y:2} as const; //类型为 {x:readonly x :number,readonly y:number}
当你在一个值后面写as const的时候,TypeScript会把它推断成最窄的类型.
更鲜明的例子:
const a1 = [1,2,3];//类型为 number[]
const a2 = [1,2,3] as const;//类型为readonly [1,2,3]
总结
- 了解TypeScript是如何通过扩展常量来推断类型的
- 熟悉影响这种行为的方法:const , 上下文,和 as const注释。
《Effective TypeScript》条款21 - 类型扩展的更多相关文章
- Effective C++ -----条款21:必须返回对象时,别妄想返回其reference
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个loc ...
- 必须返回对象时,别妄想返回其reference 【Effective C++ 条款21】
class Rational { public: Rational(, ) : n(numerator), d(denominator) { printf("Rational Constru ...
- TypeScript Type Compatibility(类型兼容)
TypeScript中的类型兼容是基于结构归类的.在普通分类的相比之下,结构归类是一种纯粹用于将其成员的类型进行关联的方法.思考下面的代码: interface Named { name: strin ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
- Util应用程序框架公共操作类(十):可空值类型扩展
当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常. 可空值类型提供 ...
- TypeScript Type Innference(类型推断)
在这一节,我们将介绍TypeScript中的类型推断.我们将会讨论类型推断需要在何处用到以及如何推断. 基础 在TypeScript中,在几个没有明确指定类型注释的地方将会使用类型推断来提供类型信息. ...
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- TypeScript 之 基础类型、高级类型
基础类型:https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Basic%20Types.html 高级类型:https ...
- TypeScript完全解读(26课时)_11.TypeScript完全解读-类型推论和兼容性
11.TypeScript完全解读-类型推论和兼容性 在一些时候省略指令,ts会帮我们推断出省略的类型的地方适合的类型,通过学习ts的类型推论了解ts的推论规则 类型兼容性就是为了适应js灵活的特点, ...
- C# 用this修饰符为原始类型扩展方法
特点:1.静态类 2.静态方法 3.第一个参数前加this 例如:public static List<T> ToList<T>(this string Json),就是为th ...
随机推荐
- vue2.x版本升级2.7版本
2022年7月1日,vue正式迎来2.7版本,代号:"Naruto".支持 Composition API + <script setup> .原文链接 也就是说,你可 ...
- 推荐王牌远程桌面软件Getscreen,所有的远程桌面软件中使用最简单的一个
今天要推荐的远程桌面软件就是这款叫Getscreen的,推荐理由挺简单: 简单易用:只需要两步就能轻松连上远程桌面 第一步:在需要被远程连接的机器上下载它的Agent程序并启动,点击Send获得一个链 ...
- UE MultiLineTraceByChannel函数返回只有一个对象的问题
问题描述 MultiLineTraceByChannel,看函数名字是返回射线检测到的所有对象,实际使用过程中,发现返回的数组中只又一个对象. Multi Line Trace by Channel ...
- PN转232网关模块接扫码枪与CPU通讯
在现代物流.汽车生产线等领域,广泛使用条码扫码枪快速扫描产品条码,提高工作效率.为了保证条码扫码枪与CPU之间的准确通信,PN转232网关模块成为关键部件.本文将深入研究PN转232网关模块(BT-P ...
- [oeasy]python0144_try的完全体_否则_else_最终_finally
try的完全体 回忆上次内容 上次细化了主控程序(main.py) 导入(get_fruits.py) 处理(process.py) 输出(output.py) 使用了 try 结构 try ...
- 暑假java自学进度总结02
一.今日所学: 1.配置环境变量 在系统内配置java路径后,再在path中 利用系统路径配置Java编译工具和运行工具路径. 2.下载并安装Natepad++,并且配置相关设置 3.初步了解了Jav ...
- UE5打包后,无法切换关卡的问题
首先是普通的会遇到的问题,比如多个Level不在同一目录,或者不在默认的Maps目录打包不成功这时候要设置,Project Settings-> Packaging 上面保证没问题之后,打包发现 ...
- CCF 任务调度
样例的示意图 查了一圈,然后很烦,不想学习方法,好卡.查了一些题解,发现都是10分,30分先搁置的博客,最后翻到 堪称官方标称的思路 (CCF题目pat题目各大poj/hdoj好戏那个都没有标程,这里 ...
- selenium高亮显示定位到的页面元素
from selenium import webdriver import unittest,time def highLightElement(driver,element): #封装好的高亮显示页 ...
- 【Spring Data JPA】02 快速上手
完成一个CRUD - 创建工程导入依赖坐标 - 配置Spring的配置文件 - 配置ORM的实体类,绑定映射关系 - 编写一个符合SpringDataJpa的dao接口 Maven依赖坐标 <p ...