TypesScript类型注解

常见的基本类型

number类型

语法:let num: number = 20;

浮点数 支持直接量 二进制0b 八进制0o 十进制 十六进制0x

string类型

语法:let str: string = '张三'; // ‘’ / “” / `${}`

boolean类型

语法:let bool: boolean = true; // true/false

TS中的布尔类型只能是true/false,没有其他可能性

null和undefined类型

语法:let nl: null = null; let ul: undefined = undefined;

定义为nul或者undefined类型的,赋值可以为null和undefined其中之一

symbol类型

语法:const symboll: Symbol = Symbol(相关描述)

独一无二的数据类型

biglnt类型

语法:let num: bigint = 20n; let num: bigint = BigInt(20);

number的精度扩展

object类型

其实在ts中也有object类型,不同的是它还有Object和{}类型

  • object类型用于表示非原始类型

  • 0bject类型是所有Object类的实例的类型

  • {}类型街述了一个没有成员的对象

特殊类型

数组类型

普通数组

表示的就是数组,但是跟JS形式不同

语法:let arr: number[] = [1,2,3,4,5];

二维数组:let arr: number\[][] = [[1,2,3,4,5]];

范型数组

let list: Array\<number> = [6,7,8,9,0];

泛型数组和数组类型很像,只是格式不一样

tuple 元组类型

语法:let tuple: [number, string] = [1, '2'];

已知数量和类型的数组

各元素的类型不必相同,但左右两边必须匹配

any类型

语法:let anyl: any = "xxx'

Any类型的变量可以赋值任意类型的值

void类型

语法:function fn0:void{}

void用于函数返回值,表示返回空

never 类型

function error(message: string): never {
	throw new Error(message);
}

never类型表示的是那些永不存在的值的类型

比如无法达到的终点的一些函数

enum类型

语法:enum Color {Red = 1, Green, Blue}

枚举(默认下标从0开始,可以直接修改下标)

可以理解为通过enum关键字声明的一个特殊的类型

枚举类型提供的一个便利是你可以由枚举的值得到它的名字:let c: Color = Color.Green

使用:let colorName: string = Color[2]; console.log(colorName); // 显示'Green'因为上面代码里它的值是2

枚举的好处就是,我们可以定义一些带名字的常量,而且还可以清晰的表达意图或创建一组有区别的用例

自定义类型

语法:type User = (name: string; age?: number,}

借助一个关键字type可声明一个类型

函数

函数类型

为了让我们重容易使用,TS为函数添加了类型

函数类型包含两部分

  • 参数类型
  • 返回值类型
function add(x:number, y:number):number{return x+y;}

参数

传参个数固定

  • 在TS中传递给一个函数的参数个数必须与函数期望的参数个数一致
  • 但这不是指不能传递null或undefined作为参数,而是说编泽器检查用户是否为每个参数都传入了值

可选参数

  • 在TS里我们可以在参数名旁使用 ?实现可选参数的功能
  • 需要特别注意的是:可选参数必须跟在必须参数后面

默认参数

  • TS中也有默认参数,形式是参数后面跟 = 号,之后跟默认值
  • 当用户没有传递这个参数或传递的值为undefined时,我们设置的默认值就会起作用

剩余参数

  • 在JS中.我们可以使用 arguments来访问所有传入的参数
  • 而在TS中,可以把所有参数收集到一个变量里

函数重载:简单来说,就是同一个函数提供多个函数类型定义来进行函数重载

类型断言

类型断言

解决的问题:保证和检测来自其他地方的数据也符合我们的要求

所调断言就是断定、确定、绝对的意思

简单来讲,类型断言就是保证数据类型一定是所要求的类型

类型守卫

类型断言还需要信助类型守卫函数

类型守卫函数就是用于判断未知数据是不是所需类型

格式:x is y.表示x是不是y类型

例子

function isUser(arg: any): arg is User (
  if (!arg) {
  	return false
  }else {
    if (typeof arg.name == 'string' && typeof arg.age== 'number'){
    	return true:
    }else {
    	return false:
    }
  }
}

高级类型

交叉类型

交叉类型是通过使用 & 符号,将多个类型合并成一个类型

联合类型

联合类型是通过使用 | 符号,使得一个属性可以拥有多种类型

let tow: (number | string) = '2';    // 联合(值可以是数字也可以是字符串)

// 定义一个函数
declare function create(o: object | null): void;    // object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
create({ prop: 0 }); // OK
create(null); // OK

属性映射Record

type Record<K extends string | number | symbol, T> = {
    [P in K]: T;
}

key可以为字符串、数字、symbol类型

Partial (部分的; 不完全的)

就是让一个定义中的所有属性都变成可选参数

type Partial<T> = {
  [P in keyof T]?: T[P]
}
  1. 将一个类型的属性名全部提取出来当做联合类型
  2. [P in keyof T]? 的冒号就代表 可选 的参数
  3. T[P] 就代表 如 Person[name]代表的是 string 类型

Required(必须的)

和Partial刚好相反,将一个定义中的属性全部变成必选参数

type Required<T> = {
    [P in keyof T]-?: T[P];
}
  1. 将一个类型的属性名全部提取出来当做联合类型
  2. 在?之前加个-,代表着这个属性是必须的。
  3. T[P] 就代表 如 Person[name]代表的是 string 类型

Pick(选择)

可以选择一个原来的接口中一部分的属性定义

type Pick<T, K extends keyof T> = {
  [P in K]: T[P]
}

pick接收两个泛型

  1. 第一个泛型 T 便是 interface 或者 type 定义
  2. 第二个就是第一个定义中的属性, extends就代表继承
    K extends keyof T 等同于 k extends ‘name’ | ‘age’,意思就是k只能是age或者name

Readonly (意思是只读的)

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
}
  1. 将一个类型的属性名全部提取出来当做联合类型
  2. readonly 修饰符代表属性是只读的
  3. T[P] 就代表 如 Person[name]代表的是 string 类型

Exclude(排除)

ts中可以排除 联合类型 中一部分的内容

type Exclude<T, U> = T extends U ? never : T
  1. 我们这里用 MyTypes 也就是 ‘name’ | ‘age’ | ‘height’ 去代表 T
  2. 用 name 属性去代表第二个泛型 U
  3. T extends U 就判断是否’name’ | ‘age’ | ‘height’ 有 name, 有name就返回never,就代表将其排除

Omit (省略的)

ts中就是将接口或者类型的键值对删除一部分

type Omit<T, K extends string | number | symbol> = {
  [P in Exclude<keyof T, K>]: T[P]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值