TypeScript学习笔记——类型
1. 类型限制
1. ts可以在变量声明时规定类型
let a: number //规定了变量a的值只能是number
let b: string //规定了变量b的值只能是string
b = false //报错,类型不匹配
2. 如果变量的声明和赋值同时进行,ts会自动规定类型
let c = “hello” //自动规定变量c为string类型,此处可以省略类型声明
3. 对函数进行类型限制
function sum(a: number, b: number): number{
return a + b
}
上述代码,ts规定了sum函数的参数,返回值类型都为number,当类型不匹配时会报错,此外,ts还会限制传入的实参个数,不同于形参个数时同样报错
需要注意的是,初始ts虽然会报错,但仍可以编译,并产生对应的js文件
2. TS的类型
1. 字面量类型
let a: 10; //规定变量a的值只能为10
a = 10;
a = 11; // 报错:不能将类型“11”分配给类型“10”
let sex: "male" | "female";
sex = "male";
sex = "female";
// 可以使用|(且)来连接多个类型(联合类型)
// 也可以使用&(或)详细看object类型
let b: string | boolean;
b = "hello";
b = false;
2. any类型
any表示的是任意类型,设置类型为any后,相当于ts对该变量关闭了类型检测(使用极少)
let d: any; //显式指明类型为any
let e; //声明时不赋值,不指明类型,会自动看做any类型(隐式指明)
d = 10;
let f: string = d;
//d的类型是any,可以赋值给任意类型的值(区别于unknown类型)
3. unknown类型
unknown表示的是未知类型
let g: unknown = "hello";
g = false
let f: string = g; //此处会报错,类型不匹配(区别于any类型)
实际上是一个类型安全的any,unknown类型的变量不能直接赋值给其他变量
解决方式:
- 赋值前进行类型判断
- 类型断言:用来告诉解析器变量的实际类型
let e: unknown = "hello"
s = e; //直接赋值会报错
s = e as string;
s = <string>e;
语法:变量 as 类型 或 <类型>变量
4. void类型
void用来表示空值(undefined),多用于规定函数没有返回值
function fn(): void {} //表示函数没有返回值
5. never类型
never表示永远不会返回结果
6. object类型
object表示对象(很少使用)
//基本使用(对象)
let a: object;
a = {};
a = function(){}
//规定对象的属性组成及类型
let b: {name: string, age?: number};//属性名后跟?表示可选属性
b = {};//报错:缺少类型
b = {name: 'wmh'};
b = {name: 'wmh', age: 18}
//规定除了name属性必需,还可以添加其他属性(属性名为string,值为any)
let e : {name: string, [propName: string]: any};
//使用&来判断满足两个对象
let f : {name: string} & {age: number};//表示需要同时满足两个内容
f = {
name: 'wmh',
age: 18
}
//基本使用(函数)
let a:(b: number, c:number) => number;//规定参数及返回值的类型
a = function(b, c){return b + c}
7. array类型
array表示一个数组
//写法一
let a: string[];//表明一个字符串数组
a = [12,12,12];//报错:类型不匹配
//写法二
let b: Array<number>;//表示一个数字数组
8. tuple类型
tuple表示一个元组,元祖就是固定长度的数组
//基本使用
let a: [string, string];
a = ['wmh', 'abc'];
9. enum类型
enum表示一个枚举,
//使用方法
enum Sex {
Female,
Male
}
let person: {name: string, sex: Sex};//规定sex为Sex枚举类
person = {
name: 'wmh',
sex: Sex.Male
}
if(person.sex === Sex.Male)
3. 其他有关于类型使用
1. 类型的别名
type myType = string;
let a: myType;//相当于let a: string