一、类型推断
1.什么是类型推断?
-
如果没有明确的指定类型,那么typescript会推断出一个类型
-
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成
any
类型。完全不被类型检查;
// 1.初始化未赋值,被推断为any类型
let personName;
// 可以赋值为字符串类型
personName = "张三";
// 可以赋值为数值类型
personName = 30;
// 2.初始化赋值未赋类型,被推断为初始类型
let personAge = 30;
// 被推断为number类型,再赋值为字符串类型会报错
personAge = "30岁";
二、联合类型
1.什么是联合类型?
-
联合类型是指:可以取定义的多种类型的一个;
-
访问联合类型的属性或方法,不确定指定类型是联合类型的哪一个,只能访问其公共的属性;
// 1.定义联合类型
let student: number|string;
student = "张三";
console.log(student.length); // 2
student = 8;
console.log(student.length); // 报错
// 2.获取联合类型的公有属性
function getString(something: string | number): string {
return something.toString();
}
三、对象类型
1.什么是对象类型接口?
-
面向对象中,接口需要类去实现它。Typescript中,用接口来约束数据类型的形状;
-
一般情况下,赋值的时候,变量的形状必须和接口的形状保持一致;
// 定义接口
interface Student {
name: string;
age: number;
}
// 一般情况下:约定指定的数据类型 必须和 接口数据类型一致
let tom: Student = {
name: 'Tom',
age: 25
};
2.可选属性
-
可选属性的含义是该属性可以不存在;
-
不可以添加新的属性;
interface Fruit {
name: string;
price?: number;
}
let apple: Fruit = {
name: '苹果'
};
// 以下不允许添加新的属性
let apple: Fruit = {
name: '苹果',
color: 'red'
};
3.任意属性
-
一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集;
// 定义任意属性
interface Fruit {
// 确定属性
name: string;
// 可选属性
price?: number;
// 确定属性 和 自定义属性 一定是任意属性的子集
[propName: string]: string | number;
}
let apple: Fruit = {
name: '苹果',
price: 25,
color: 'red'
};
4.只读属性:readonly
-
对象中的一些字段只能在创建的时候被赋值,即定义为只读属性;
interface Fruit{
readonly id: number;
name: string;
}
let apple: Person = {
id: '001',
name: '苹果'
};
// 报错,只读属性不能重新赋值
apple.id = "002";