TypeScript 学习笔记 — 类型推断和类型保护(十一)
类型推断
TypeScript 编译器会根据一些简单的规则来推断开发者定义的变量的类型, 当没有标明变量的类型时,编译器会将变量的初始值作为该变量的类型
1.赋值推断
赋值时推断,类型从右像左流动,会根据赋值推断出变量类型,这种是比较常见的,声明时不需要给类型
let str = "zhufeng";
let age = 11;
let boolean = true;
2.返回值推断
自动推断函数返回值类型
function sum(a: string, b: string) {
return a + b;
}
sum("a", "b");
3.函数推断(反向推断)
函数从左到右进行推断(上下文类型):先声明一个函数类型,后把这个类型赋予给一个变量,在赋值一个函数,再看被赋值的函数是否满足,事先声明的函数类型,
上下文类型推断时,会根据参数的位置进行相应的推断,函数的参数多的时候,就会推断失败报错
type Sum = (a: string, b: string) => string; // 函数类型
const sum: Sum = (a, b) => a + b; // 还可以根据函数类型,推导出函数参数和返回值的类型
type ICallback = (x: string, y: string) => void; // 不关心返回值
function fn(cb: ICallback) {
let r = cb("1", "2"); // 调用函数后不会根据返回值来推导,默认采用就是上下文中声明的类型
}
fn((a, b) => {});
4.属性推断
可以通过属性值,推断出属性的类型
let person = {
name: "yyya",
age: 18,
};
let { name, age } = person; // string number
5.类型反推
可以使用 typeof 关键字反推变量类型
let person = {
name: "yyya",
age: 18,
};
type Person = typeof person; // type Person = {name: string; age: number;}
6.索引访问操作符
interface IPerson {
name: string;
age: number;
job: {
address: string;
};
}
type job = IPerson["job"]; // type job = { address: string; }
7.类型映射
interface IPerson {
name: string;
age: number;
}
type MapPerson = { [key in keyof IPerson]: IPerson[key] }; // type MapPerson = {name: string; age: number;}
类型保护
TypeScript 能够在特定的区块中保证变量属于某种确定的类型。可以在此区块中放心的引用此类型的属性,或者调用此类型的方法
通过判断识别所执行的代码块,自动识别变量属性和方法
1.typeof 类型保护
判断基本类型:ts 默认在使用联合类型,针对某一种类型进行处理,对不同的类型进行范围缩小
function double(a: string | number) {
if (typeof a === "string") {
return a + a;
} else {
return a * 2;
}
}
2.instanceof 类型保护
判断一个实例是否属于某个类
class Cat {}
class Dog {}
const getInstance = (clazz: { new (...args: any[]): Cat | Dog }) => {
return new clazz();
};
let r = getInstance(Cat);
if (r instanceof Cat) {
r;
} else {
r;
}
3.in 类型保护
判断一个属性是否属于某个对象
interface Bird {
fly: string;
}
interface Fish {
swim: string;
}
function getType(type: Bird | Fish) {
if ("swim" in type) {
type;
} else {
type;
}
}
4.可辨识联合类型
通过接口中的 kind 作为可辨识类型
interface Bird {
fly: string;
kind: "鸟";
}
interface Fish {
swim: string;
kind: "鱼";
}
function getType(type: Bird | Fish) {
if (type.kind == "鸟") {
type;
} else {
type;
}
}
// 判断一个变量是数组,通过其类型来辨识
function ensureArray<T>(input: T | T[]): T[] {
if (Array.isArray(input)) {
return input;
} else {
return [input];
}
}
5.null 保护
变量判空给默认值的方式实现
function addPrefix(num?: number) {
num = num || 0; // null 保护
return function (prefix: string) {
return prefix + num!.toFixed();
};
}
let r = addPrefix()("$");
6.自定义类型保护
直接调用isBird方法
不确认 返回 true 是 Bird,还是返回 false 是 Bird,因此工具方法中判断类型的方法 全部需要使用 is 语法
function isBird(val: Bird | Fish | (string & { kind: "string" })): val is Bird {
return val.kind == "鸟"; // 必须是boolean
}
function getType(val: Bird | Fish) {
if (isBird(val)) {
// 此时不确认 返回true是Bird,还是返回false是Bird
val;
} else {
val;
}
}
TypeScript 学习笔记 — 类型推断和类型保护(十一)的更多相关文章
- TypeScript 学习笔记 — 函数中的类型(四)
目录 函数的两种声明方式 可选参数 默认参数 剩余参数 函数的重载 this 的类型 对于函数主要关心的是:函数的入参类型 和 函数的返回值类型 函数的两种声明方式 通过 function 关键字来进 ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- TypeScript学习笔记(八):1.5版本之后的模块和命名空间
我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...
随机推荐
- 莫烦tensorflow学习记录 (6)卷积神经网络 CNN (Convolutional Neural Network)
卷积 和 神经网络 莫烦大佬的原文章https://mofanpy.com/tutorials/machine-learning/tensorflow/intro-CNN/ 我的理解就是千层饼,鸡蛋烧 ...
- Opencv笔记(12)傅里叶变换
在之前了解的OpenCV为我们实现的图像变换,这些本质上是从图像到输出图像的映射,即输入仍是一幅图像.本章的傅里叶变换,输出数组的值在含义上和原图像的强度值大不相同,是输入图像的频域表示. cv::d ...
- 【WPF】Dispatcher 与消息循环
这一期的话题有点深奥,不过按照老周一向的作风,尽量讲一些人鬼都能懂的知识. 咱们先来整个小活开开胃,这个小活其实老周在 N 年前写过水文的,常阅读老周水文的伙伴可能还记得.通常,咱们按照正常思路构建的 ...
- kettle从入门到精通 第三十二课 mysql 数据连接集群/分区配置
1.这里的集群实际上是数据分区或者分片的概念,如中国全国的学生,应该不会都存在一张表里面,有可能每个省市一个表进行存储. 2.集群(分区),如下图所示 设置在"集群"标签,勾选&q ...
- 任意树遍历,可以使用 goto 跳记号标注的
先顺序进入到最后一个根的根部,完后扫描同级 同级扫描完用 goto跳代码改层数到倒数地二层 之后操作就是倒着往上搜索的,有难度,但是还是能做到的嘛 用 lisit 好像不需要别的,全用 list 连接 ...
- win10无线网卡不会自动连接
usb接口的网卡.win10无线网卡不会自动连接. 解决方法: 第一步:在控制面板\网络和 Internet\网络连接中,禁用再启用一次无线网络. 第二步:在 控制面板\硬件和声音\电源选项\选择电源 ...
- 太卷了,史上最简单的监控系统 catpaw 简介
指标监控的痛点 当下比较流行的监控系统,比如 Prometheus.Nightingale.VictoriaMetrics,都是基于数值型指标的监控系统,这类监控系统的痛点在于:告警的时候只能拿到异常 ...
- work08
day09作业: 必做题:========================================第一题: 1.定义一个Animal类,包含如下行为: eat() 打印"要吃饭&qu ...
- Navicat 连接SQL Server LocalDB的方法
截止2021年11月,Sql Server LocalDB的资料网上并不多见,出来了其实也有一段年头了. SqlServerManagerStudio自带的工具进行查询使用体验并不好,Navicat是 ...
- 《Node.js+Vue.js+MangoDB全栈开发实战》已出版
<Node.js+Vue.js+MangoDB全栈开发实战> 图书购买地址: 京东:<Node.js+Vue.js+MangoDB全栈开发实战> 当当:<Node.js+ ...