浅谈Vue3.0之前你必须知道的TypeScript实战技巧


Posted in Javascript onSeptember 11, 2019

很多人对TypeScript的使用还停留在基本操作上,其实TypeScript的特性非常强大,我们利用好这些特性可以有效地提高代码质量、加速开发效率,今天就介绍9个非常实用的TypeScript技巧或者特性.

注释的妙用

我们可以通过 /** */ 来注释TypeScript的类型,当我们在使用相关类型的时候就会有注释的提示,这个技巧在多人协作开发的时候十分有用,我们绝大部分情况下不用去花时间翻文档或者跳页去看注释。

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

巧用类型推导

TypeScript 能根据一些简单的规则推断(检查)变量的类型。

比如一个简单的add函数

function add(a: number, b: number) {
 return a + b
}

TypeScript就可以通过参数与return的运算符推导出函数的返回值

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

如果想获取函数整体的类型那么可以借助 typeof

注意与JavaScript中的typeof区分开

type AddFn = typeof add

当然上述情况算是比较简单的情况,有时候我们的返回值类型其实比较复杂,这个时候借助类型推导和 ReturnType 就可以很轻松地获取返回值类型。

type returnType = ReturnType<typeof add> // number

上述技巧在对redux进行编码的时候非常适用,这样可以省略我们大量的重复代码,毕竟redux的编码工作是非常繁琐的。

巧用元组

有时候我们可能需要批量的来获取参数,并且每一个参数的类型还不一样,我们可以声明一个元组如:

function query(...args:[string, number, boolean]){
 const d: string = args[0];
 const n: number = args[1];
 const b: boolean = args[2];
}

巧用Omit

有时候我们需要复用一个类型,但是又不需要此类型内的全部属性,因此需要剔除某些属性,这个时候 Omit 就派上用场了。

interface User {
 username: string
 id: number
 token: string
 avatar: string
 role: string
}
type UserWithoutToken = Omit<User, 'token'>

这个方法在React中经常用到,当父组件通过props向下传递数据的时候,通常需要复用父组件的props类型,但是又需要剔除一些无用的类型。

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

运用Record

Record 是TypeScript的一个高级类型,但是相关的文档并不多,所以经常被人忽略,但是是一个非常强大的高级类型。

Record允许从Union类型中创建新类型,Union类型中的值用作新类型的属性。

举个简单的例子,比如我们要实现一个简单的汽车品牌年龄表,一下写法貌似没有问题。

type Car = 'Audi' | 'BMW' | 'MercedesBenz'

const cars = {
 Audi: { age: 119 },
 BMW: { age: 113 },
 MercedesBenz: { age: 133 },
}

虽然这个写法没问题,但是有没有考虑过类型安全的问题?

比如:

  • 我们忘记写了一个汽车品牌,他会报错吗?
  • 我们拼写属性名错误了,它会报错吗?
  • 我们添加了一个非上述三个品牌的品牌进去,他会报错吗?
  • 我们更改了其中一个品牌的名字,他会有报错提醒吗?

上述这种写法统统不会,这就需要Record的帮助。

type Car = 'Audi' | 'BMW' | 'MercedesBenz'
type CarList = Record<Car, {age: number}>

const cars: CarList = {
 Audi: { age: 119 },
 BMW: { age: 113 },
 MercedesBenz: { age: 133 },
}

当我们拼写错误:

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

当我们少些一个品牌:

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

当我们添加了一个非约定好的品牌进去:

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

在实战项目中尽量多用Record,它会帮助你规避很多错误,在vue或者react中有很多场景选择Record是更优解。

巧用类型约束

在 .jsx 文件里,泛型可能会被当做 jsx 标签

const toArray = <T>(element: T) => [element]; // Error in .jsx file.

加 extends 可破

const toArray = <T extends {}>(element: T) => [element]; // No errors.

交叉类型

交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。

在 JavaScript 中,混入是一种非常常见的模式,在这种模式中,你可以从两个对象中创建一个新对象,新对象会拥有着两个对象所有的功能。交叉类型可以让你安全的使用此种模式:

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

联合类型

在 JavaScript 中,你希望属性为多种类型之一,如字符串或者数组。这就是联合类型所能派上用场的地方(它使用 | 作为标记,如 string | number)。

function formatCommandline(command: string[] | string) {
 let line = '';
 if (typeof command === 'string') {
 line = command.trim();
 } else {
 line = command.join(' ').trim();
 }
}

类型别名

类型别名会给一个类型起个新名字,类型别名有时和接口很像,但是可以作用于原始值,联合类型,元组以及其它任何你需要手写的类型。

类型别名可以是泛型

type Container<T> = { value: T };

也可以使用类型别名来在属性里引用自己:

type Tree<T> = {
 value: T;
 left: Tree<T>;
 right: Tree<T>;
}

类型别名看起来跟interface非常像,那么应该如何区分两者?

interface只能用于定义对象类型,而type的声明方式除了对象之外还可以定义交叉、联合、原始类型等,类型声明的方式适用范围显然更加广泛。

但是interface也有其特定的用处:

  • interface 方式可以实现接口的 extends 和 implemenjs
  • interface 可以实现接口合并声明
type Alias = { num: number }
interface Interface {
 num: number;
}
declare function aliased(arg: Alias): Alias;
declare function interfaced(arg: Interface): Interface;

此外,接口创建了一个新的名字,可以在其它任何地方使用。 类型别名并不创建新名字—比如,错误信息就不会使用别名。 在下面的示例代码里,在编译器中将鼠标悬停在interfaced上,显示它返回的是Interface,但悬停在aliased上时,显示的却是对象字面量类型。

浅谈Vue3.0之前你必须知道的TypeScript实战技巧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 判断脚本加载完毕的代码
Jul 13 Javascript
如何将一个String和多个String值进行比较思路分析
Apr 22 Javascript
js仿百度有啊通栏展示效果实现代码
May 28 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
Jun 24 Javascript
javascript阻止scroll事件多次执行的思路及实现
Nov 08 Javascript
JavaScript中的标签语句用法分析
Feb 10 Javascript
JavaScript中的small()方法使用详解
Jun 08 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
jQuery代码性能优化的10种方法
Jun 21 Javascript
vue如何将v-for中的表格导出来
May 07 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
JS Ajax请求会话过期处理问题解决方法分析
Nov 16 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 #Javascript
如何实现一个简易版的vuex持久化工具
Sep 11 #Javascript
浅谈layer弹出层按钮颜色修改方法
Sep 11 #Javascript
layui实现鼠标移动到单元格上显示数据的方法
Sep 11 #Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
Sep 11 #Javascript
layui操作列按钮个数和文字颜色的判断实例
Sep 11 #Javascript
JS模拟浏览器实现全局搜索功能
Sep 11 #Javascript
You might like
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
js日历功能对象
2012/01/12 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
js实现省市级联效果分享
2017/08/10 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
python文件与目录操作实例详解
2016/02/22 Python
Flask框架的学习指南之开发环境搭建
2016/11/20 Python
python执行使用shell命令方法分享
2017/11/08 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
浅析Python3 pip换源问题
2020/01/06 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
JAVA程序员面试题
2012/10/03 面试题
中专毕业个人的自荐信格式
2013/09/21 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
平安工地汇报材料
2014/08/19 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
python实现手机推送 代码也就10行左右
2022/04/12 Python