首页 > 其他分享 >[学习笔记]TypeScript查缺补漏(二):类型与控制流分析

[学习笔记]TypeScript查缺补漏(二):类型与控制流分析

时间:2023-11-01 19:14:51浏览次数:37  
标签:补漏 TypeScript const string 控制流 number 类型 input 字面

@

目录

类型约束

TypeScript中的类型是一种用于描述变量、函数参数和函数返回值的特征的方式。

代码中定义类型的部分不会在原生JavaScript环境中编译

在这里插入图片描述

基本类型

包括number、string、boolean、null、undefined和symbol。

联合类型

联合类型(Union Types)是指用“|”符号将多个类型组合成一个的类型。这意味着一个变量可以存储多种类型的值

let value: number | string = 42;

控制流分析

TypeScript 本身是一种静态类型语言,它在编译时进行类型检查,因此控制流分析在编译阶段就已经开始了

比如:

function getUserInput():string|number{
  if(new Date() != new Date("2023-11-01")){
    return "yes";
  }
  else {
    return 0;
  }
}

此时Typescript的控制流分析将data类型视为 string | number

在这里插入图片描述

instanceof和typeof

typeof操作符用于获取一个值的类型。它返回一个字符串,表示值的类型

instanceof操作符用于判断一个对象是否属于某个类的实例

使用typeof input === "string" 和 input instanceof String 这两个判断有什么区别:

typeof只能用于判断基本类型,instanceof可以用于判断自定义的类型,例如类,接口,数组等
instanceof 可以用于判断一个对象是否是某个类的实例,包括继承自该类的子类。

类型守卫和窄化

类型守卫用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值的常规函数,接受一个类型并告诉 TypeScript 是否可以缩小到更具体的类型。

缩小到更具体的类型的过程称之为“窄化(Narrowing)”,它能根据代码中的逻辑减少联合中的类型数量。大多数窄化来自if语句中的表达式,其中不同的类型操作符在新的范围内窄化。

typeof判断

var input = getUserInput()
input  // string |number
if (typeof input === "string") {
  input  // string
}

instanceof判断

var input = getUserInput()
input  // number | number[]
if (input instanceof Array)) {
  input  // number[]
}

in判断

var input = getUserInput()
input  // string | {error: ...}
if ("error" in input) {
  input  // {error: ...}
}

内建函数,或自定义函数


var input = getUserInput()
input  // number | number[]
if (Array.isArray(input)) {
  input  // number[]
}


// 验证是否是number类型
function isNumber(x: any): x is number {
  return typeof x === "number";
}

// 验证是否是string类型
function isString(x: any): x is string {
  return typeof x === "string";
}


var input=getUserInput(); //string | number
if (isNumber(input)){
  input // number
}

赋值

赋值过后的变量,也将发生“窄化”

let data: string | number = ..
data // string | number
data ="Hello"
data // string

布尔运算

执行布尔运算时在一行代码里也会发生窄化

var input = getUserInput()
input  // number | string
const inputLength = (typeof input ==="string" && input.length) || input //string

保留共同属性

当联合类型的所有成员都有相同的属性名称时,这些属性会被保留

type Responses =
|{ status: 200, data: any }
|{status :301, to: string }
|{status: 400,error: Error }

const response = getResponse()
response // Responses
switch(response.status) {
  case 200: return response.data
  case 301: return redirect(response.to)
  case 400: return response.error
}

字面量类型(literal type)

字面量类型指的是使用字面量语法来定义的类型。字面量类型是一种特殊的类型,它允许你使用字面量值来定义类型的约束。

字面量类型包括以下几种:

  1. 数字字面量类型:使用数字字面量来定义数字类型的约束。例如,0、1、2 等。
  2. 字符串字面量类型:使用字符串字面量来定义字符串类型的约束。例如,"hello"、"world" 等。
  3. 布尔字面量类型:使用布尔字面量 true 和 false 来定义布尔类型的约束。
  4. 元组字面量类型:使用元组字面量 [item1, item2, ...] 来定义元组类型的约束。例如,[1, "hello"] 表示一个包含一个数字和一个字符串的元组。
  5. null 和 undefined 字面量类型:使用 null 和 undefined 字面量来表示 null 和 undefined 类型的约束。
  6. 空类型字面量:使用 {} 来定义一个空类型的约束,表示该类型没有任何属性或方法。
  7. 任意值字面量类型:使用 any 关键字来定义任意值的约束,表示该类型可以接受任何类型的值。

编译器在编译期间进行类型检查,提高代码的可读性和可维护性。

通常字面量类型不会单独出现,而是配合联合类型,用于约束类型的值

declare function handleRequest(url: string, method: "GET" | "POST"): void;

handleRequest(req.url, "GET");  //编译通过

handleRequest(req.url, "MYGET");  //编译不通过,值不合法

as const 作用

使用“as const”将类型锁定为其字面量版本

在 TypeScript 中,as const 用来明确告诉 TypeScript 编译器这个变量是只读的(const),并且它的类型是字面量类型

还是刚刚的例子

declare function handleRequest(url: string, method: "GET" | "POST"): void;
const req = { url: "https://example.com", method: "GET" };
handleRequest(req.url, req.method);

编译器会报错

在这里插入图片描述

原因是req类型被识别为

在这里插入图片描述

const req = { url: "https://example.com", method: "GET" } as const;

当加上“as const”识别为字面量版本的类型

在这里插入图片描述

-本章完-

标签:补漏,TypeScript,const,string,控制流,number,类型,input,字面
From: https://www.cnblogs.com/jevonsflash/p/17803863.html

相关文章

  • 如何通过TypeScript采集高德图片
    相信大家开车一定都用过导航,高德地图就是一款非常优秀的导航软件,它以精准、高效而文明。今天我就给大家分享一个通过TypeScript简单采集高德图片的示例,可能没什么太大的用处,纯属个人爱好,不喜勿喷哈·~一起来看看吧。```typescriptimportsuperagentfrom'superagent';constprox......
  • needle库下载TypeScript程序用HTTP做个爬虫模版
    下面是一个使用needle库进行下载的TypeScript程序,它下载了pinduoduo的内容,并且使用了proxy_host为duoip,proxy_port为8000的爬虫IP。importneedlefrom'needle';//设置爬虫IPneedle.requestDefaults({proxy:{host:'duoip',port:8000}});//......
  • DP查缺补漏之01背包优化原理
    DP查缺补漏之01背包优化原理先复习一下基本知识状态假设DP[I][J]为前\(i\)个物品,容量小于\(j\)时的最优解(最大价值)状态转移DP[I][J]=max(DP[I-1][J],DP[I-1][J-V[I]]+W[I])对于第\(i\)个物品,两种可能装入背包则状态应通过前\(i-1\)个物品,容量小于\(j......
  • [学习笔记]TypeScript查缺补漏(一):类
    @目录基础知识创建类型类的初始化类型和值JSDoc注释字段私有字段可选和非可选字段字段类型约束Getter/Setter静态成员函数重载构造函数参数属性类的实例化箭头函数this的作用域全局类和对象方法泛型泛型类泛型接口泛型函数装饰器基础知识创建类型classAbc{}类的初始化co......
  • TypeScript入门到精通——泛型
    泛型 泛型程序设计是一种编程风格或编程范式,它允许在程序中定义形式类型参数,然后在泛型实例化时使用实际类型参数来替换形式类型参数。通过泛型,我们能够定义通用的数据结构或类型,这些数据结构或类型仅在它们操作的实际类型上有差别。泛型程序设计是实现可重用组件的一种手段。......
  • TypeScript入门到精通——TypeScript类型系统基础——类
    类 JavaScript是一门面向对象的编程语言,它允许通过对象来建模和解决实际问题。同时,JavaScript也支持基于原型链的对象继承机制。虽然大多数的面向对象编程语言都支持类,但是JavaScript语言在很长一段时间都没有支持它。在JavaScript程序中,需要使用函数来实现类的功能。 ......
  • TypeScript入门到精通——TypeScript类型系统基础——类型别名
    类型别名 如同接口声明能够为对象类型命名,类型别名声明能够为TypeScript中的任意类型命名。一、类型别名声明 类型别名声明能够定义一个类型别名,它的基本语法如下所示:typeAliasName=Type 在该语法中,type是声明类型别名的关键字;AliasName表示类型别名的名称;Ty......
  • 鸿蒙极速入门(三)-TypeScript语言简介
    ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,需要先了解一下TS语言的基础知识。一、基础类型1.数字类型-number双精度64位浮点值。它可以用来表示整数和分......
  • TypeScript入门到精通——TypeScript类型系统基础——函数类型
    函数类型一、常规参数类型 在函数形式参数列表中,为参数添加类型注解就能够定义参数的类型。例如,在下列中将add函数声明中的参数x和参数y的类型都定义为number类型。functionadd(x:number,y:number){returnx+y;} 针对函数表达式和匿名函数,我们也可......
  • TypeScript入门到精通——TypeScript类型系统基础——对象类型
    对象类型 在JavaScript中存在这样一种说法,那就是"一切皆为对象"。有这种说法是因为JavaScript中绝大多数值都可以使用对象来表示。例如:函数、数组和对象字面量本质上都是对象。对于原始数据类型、如String类型,JavaScript也提供了相应的构造函数来创建能够表示原始值的......