类型推断

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 学习笔记 — 类型推断和类型保护(十一)的更多相关文章

  1. TypeScript 学习笔记 — 函数中的类型(四)

    目录 函数的两种声明方式 可选参数 默认参数 剩余参数 函数的重载 this 的类型 对于函数主要关心的是:函数的入参类型 和 函数的返回值类型 函数的两种声明方式 通过 function 关键字来进 ...

  2. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  3. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  9. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  10. TypeScript学习笔记(八):1.5版本之后的模块和命名空间

    我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...

随机推荐

  1. PageOffice既保存Word文件中指定区域的数据又保存整篇文件

    一.首先在word文件中给需要在后台获取数据的区域设置以PO_开头的书签. 二.通过pageoffice在线打开文件并编辑保存.有两种打开文件的模式 1.普通编辑模式(docNormalEdit) 普 ...

  2. Python:Python中的参数屏蔽

    我们有时会不经意间写下如下代码: def update_indices(indices): indices = [] # 像在更新indices前先将其置空 for i in range(10): i ...

  3. kubernets之了解Qos等级

    一  Qos的种类 BestEffort(优先级最低) Burstable(中等优先级) Guaranteed(最高优先级) 二  Qos的作用 众所周知,节点上面的limits允许超卖,当节点上面的 ...

  4. docker 监控数据整合

    安装docker #开启内核转发 echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf sysctl -p wget -O /etc/yum.repo ...

  5. MQTT服务器连接不上的问题

    问题描述 环境:阿里云服务器Ubuntu 22.04.3 LTS,安装mosquitto后,在虚拟机端订阅消息出现报错(以前用阿里云Ubuntu20.04 LTS的服务器装上就能用),以下服务器ip是 ...

  6. ftp和tftp有什么区别

    TFTP和FTP都是文件传输协议,但它们在很多方面存在明显的区别. 安全性:FTP协议使用的是明文传输,而TFTP协议使用的是UDP协议,没有使用TCP,所以不提供验证. 传输方式:FTP协议使用的是 ...

  7. Qt OPC UA通信

    介绍 OPC UA全称Open Platform Unified Architecture,开放平台统一架构,是工业自动化领域通用的数据交换协议,它有两套主要的通信机制:1.客户端-服务器通信:2.发 ...

  8. webpack配置图片处理

    # 安装 npm i -D url-loader html-loader file-loader # loader配置 module: { rules: [ // 图片处理 { test: /\.(p ...

  9. CF1753

    CF1753 成功因为虚拟机炸了,重新写一遍此文. 都是没有保存的错. A. Make Nonzero Sum 由于 Note that it is not required to minimize ...

  10. C#字符串截取分割方法

    字符串操作:分割 Split.连接数组 Join.拼接 Format.截取 Substring.替换 Replace.左填充 PadLeft.右填充 PadRight.删除 Remove 1 //分割 ...