Typescript – 类型声明
简介
- 类型声明是TS非常重要的一个特点
- 通过类型声明可以指定TS中变量(参数、形参)的类型
- 指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错
- 简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值
声明变量
let 变量: 类型;
let 变量: 类型 = 值;
function fn(参数: 类型, 参数: 类型): 类型{
...
}
Typescript 中的类型
类型 | 例子 | 描述 |
---|---|---|
number | 1, -33, 2.5 | 任意数字 |
string | 'hi', "hi", hi |
任意字符串 |
boolean | true、false | 布尔值true或false |
字面量 | 其本身(如 let a:10) | 赋值了就不能再改了,类似常量 |
any | * | 任意类型 |
unknown | * | 类型安全的any |
void | 空值(undefined) | 没有值(或undefined) |
never | 没有值 | 不能是任何值 |
object | {name:'孙悟空'} | 任意的JS对象 |
array | [1,2,3] | 任意JS数组 |
tuple | [4,5] | 元素,TS新增类型,固定长度数组 |
enum | enum{A, B} | 枚举,TS中新增类型 |
number 类型
let decimal: number = 6; // 整数
let hex: number = 0xf00d; // 十六进制
let binary: number = 0b1010; // 二进制
let octal: number = 0o744; // 八进制
let big: bigint = 100n; // 大整型
object 类型
object 表示一个 js 对象
let a : {name: string}
a = {name: 'TZMing'}
? 可选属性
按上面的代码来看,如果具有类型约束的情况,当出现以下条件时就会报错
a = {name: 'TZMing', age: 18} // 报错,原对象中没有 age 属性
那么可以使用 可选属性 来声明某个属性在赋值时可有可无
let a : {name: string, age?: number}
任意添加任意属性
当我们对对象做任意添加属性时,因为类型约束被限制,但是我又想往对象中加入多个属性时,可以声明任意添加属性。
let a : {name: string, [propsName: string]: any}
a = {name: 'TZMing', age: 18, class: '一班', ....}
[propsName: string]
指的是接收一个用于存放“其它”属性值的属性名,众所周知, js 的属性名其实都是 string 类型的,所以[propsName: string]
表示接收多个属性名,
[propsName: string]: any
则为能接收多个属性名和任意属性值。
array 数组类型
数组的类型
声明方法一:
let arr: number[]
let arr: string[]
声明方法二:
let arr: Array<number>;
let arr: Array<string>;
tuple元组类型
元组就是固定长度的数组
它和数组的区别是,数组是可变成员类的,而元组是固定成员数量,固定每个成员的类型
let tup:[string, number];
tup = ['hello', 123]
enum 枚举类型
枚举类型是用于方便开发者识别某些可选值的,比如姓别只有男和女,我们通常不会直接使用 '男' 或 '女' 去存储,通常会使用某些值来代替姓别,比如 '0' 代表 '女','1' 代表 '男',但是使用 0,1 来表示男女姓别可读性非常低,可以使用 enum 来别名 0 和 1 的。
enum Gender {
Male = 1,
Female = 0
}
这样直接使用 Male
和 Female
来表示 0 和 1。甚至可以用 Male
和 Female
来表达性别了。这种情况通常使用在可选项上。
any 类型
any 表示的是任意类型,一个变量设置类型为 any 后相当于对该变量关闭了 TS 的类型检测,在使用 TS 时,不建议使用 any 类型
let a: any
a = 'string'
a = 10
a = true
unknown 类型
unknown 表示未知类型的值,实际上就是一个类型安全的 any 类
unknown 类型的变量,不能直接赋值给其他变量
let res: string;
let a: any = 10;
res = a; // 在 a 是 any 情况下,系统不管 res 和 a 的类型是否一样
在它还没有确定好类型之前,它不能赋给任何变量
let res: string;
let b: unknown = 'hello';
res = b; // 在 b 是 unknown 情况下,报错,系统不允许 unknown 类值赋给别的类型,那怕它的值和被赋的值类型一样
res = b as string; // 但是当 b 的值被确定为 string 类时,就可以赋值
字面量赋值
所谓的字面量赋值是指,把某一值或某若干值作为类型,比如下面的代码
let a: number = 10 // a的类型是 number , 值是 10
字面量赋值,单个字面量
let a: 10 // a的类型是 10 , 值也是 10,和 const 类似
若干个字面量贼值
let a: 'man' | 'women' // a的类型可以是 'man' , 也可以是 'women'
a = 'xxx' // a不能是除 'man' 和 'women' 以外的值了。
类型作为字面量
let a: string | number // a的类型可以是 string 类 , 也可以是 number 类
& 表示同时满足多个类型的值
let a:{name: string} & {age: number}
即 a 对象中,必须满足 name: string 的值,同时也要满足 age: number 的值
let a: string & number --> 要求 a 的值既是 string 类的 也是 number 类的。
多类型变量
在 TS 中,一个变量不止可以声明单个类型,还可以声明多个类型,它分为 "或" 和 "且"
或( | )
是指,一个变量中,它可以既满足一种类型,也满足另一种类型
let a: string | number; // 既可是 string 类型的值,也可以是 number 类型的值
let a: 'man' | 'women'; // 即可以是 'man' , 也可以是 'women'
let a: {name: string} | {age: number}; // 既可以只包含name的对象,也可以是只包含 age 的对象
且( & )
是指,一个变量中,它既要满足一种类型,也要满足另一种类型
let a: string & number; // 值既要是 string 类的,也要是 number 类的(不实际)
let a: 'man' & 'women'; // 即要是 'man' , 也要是 'women'(不实际)
let a: {name: string} & {age: number}; // 既包含name的对象,也要包含 age 的对象
void 类型
void 用来表示空,以函数为例,就表示没有返回值的函数
return undefined 类型
return null 类型
都可以是 void 类型
function foo() : void {
return null; // 允许返回
return undefined; // 允许返回
return; // 允许返回
return 'string'; // 报错,不允许
}
never 类型
never 表示永远不会返回结果,永远不会有值
与 void 类型不同的是,它连 null
和 undefined
都不允许返回,用的比较少
function foo() : never {
return null; // 报错,不允许
return undefined; // 报错,不允许
return; // 报错,不允许
return 'string'; // 报错,不允许
}
共有 0 条评论