文章目录
常见的基本类型
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]
}
- 将一个类型的属性名全部提取出来当做联合类型
- [P in keyof T]? 的冒号就代表 可选 的参数
- T[P] 就代表 如 Person[name]代表的是 string 类型
Required(必须的)
和Partial刚好相反,将一个定义中的属性全部变成必选参数
type Required<T> = {
[P in keyof T]-?: T[P];
}
- 将一个类型的属性名全部提取出来当做联合类型
- 在?之前加个-,代表着这个属性是必须的。
- T[P] 就代表 如 Person[name]代表的是 string 类型
Pick(选择)
可以选择一个原来的接口中一部分的属性定义
type Pick<T, K extends keyof T> = {
[P in K]: T[P]
}
pick接收两个泛型
- 第一个泛型 T 便是 interface 或者 type 定义
- 第二个就是第一个定义中的属性, extends就代表继承
K extends keyof T 等同于 k extends ‘name’ | ‘age’,意思就是k只能是age或者name
Readonly (意思是只读的)
type Readonly<T> = {
readonly [P in keyof T]: T[P];
}
- 将一个类型的属性名全部提取出来当做联合类型
- readonly 修饰符代表属性是只读的
- T[P] 就代表 如 Person[name]代表的是 string 类型
Exclude(排除)
ts中可以排除 联合类型 中一部分的内容
type Exclude<T, U> = T extends U ? never : T
- 我们这里用 MyTypes 也就是 ‘name’ | ‘age’ | ‘height’ 去代表 T
- 用 name 属性去代表第二个泛型 U
- 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]
}