原始数据类型
TS 作为 JS 的超集,必然包含 JS 所有的数据类型,它们分别是:
Boolean 布尔值
Number 数值
String 字符串
Function 函数
Array 数组
Object 对象
NaN 计算错误
undefined 未定义
null 空
除此之外,TS 还新增了以下的数据类型:
void 要求表达式的值是undefined
any 任意值
never 永不存在
元组 固定长度的数组
enum 枚举
unknown 未知类型
联合类型
- 联合类型(Union Types)表示取值可以为多种类型中的一种。
语法格式:
let 变量:类型1 | 类型2
`也可直接字面量直接赋值`
列子:
let myFavoriteNumber: string | number;
myFavoriteNumber = true; //报错
// myFavoriteNumber 类型指定了 只能是string 和 number 类型 直接赋予布尔值是不准予的
类型断言
- 类型断言(Type Assertion )可以用来手动指定一个值的类型。
语法格式:
值 as 类型 或 <类型>值
// 创建一个person来存储人的信息 这个信息呢我们需要想后台请求的时候才能获取数据赋值给person
let person ={}
console.log(person.name)
// 此时person数据还没有请求到 person此时没有name属性 我们直接访问name ts检测时会报错!!
改为
let person ={} as any
// let person = <any>{} 这种写法也是相同的 但在jsx中得用 as 语法
console.log(person.name)
// 加了 类型断言 表示告诉ts指定person类型值任意类型 这样就可跳过检测了
接口 ( interface )
- 在 TypeScript 中,我们使用接口(Interfaces)来定义对象或函数参数的类型。
语法格式:
interface Person {
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
age: 25
};
// 我们定义了一个接口 Person,接着定义了一个变量 tom,它的类型是 Person。这样,我们就约束了 tom 的形状必须和接口 Person 一致。 属性必须得是跟接口是一致的不能多 不能少 不然会报错
// name : string 必须值 有一个 key为name 值必须是字符串
// age? : number age可选值 表示这个属性可有可没有 有 值就得是数值
// [propName:string] : any 任意属性 一般都定义在接口的最后一个属性 接口定义这个属性后 tom就可以增加任意属性
函数
- 在 ts 中函数 输入多余的(或者少于要求的)参数,不符合返回的类型 ,都是不被允许的
语法格式:
(参数:类型):函数返回值的类型=>{}
案列:
function buildName(firstName: string, lastName: string = 'Cat', lastName?: string):string{
return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat','Dog'); // 报错 多了一个参数
let tom = buildName('Tom'); // 报错 少了一个参数
// lastName?: string ----- 加了问号的表示可选参数非必填 但后面不允许再出现必需参数了
// lastName: string = 'Cat' -----设置参数默认值并限制了类型
数组
- 规定了 数据中每个元素的类型
语法格式:
let 变量:类型[]
|| 等价于
let 变量:Array<类型>
let a:string[] = ["1","2"] // 正常
let a:string[] = ["1",2] // 报错
// 指定了类型 数组里的元素得和指定的类型一样
元组
- 简单理解就是固定长度的数组
语法格式:
let tom: [string, number];
tom[0] = "Mike" // 可以只赋值其中一项
tom = ['Tom']; // 报错
// 元组在声名时 数组的长度就规定了 在赋值时数量需要一致 单个赋值不会报错
// 任何修改数组结构的方法都是不可以的 如:push splice
枚举
- 枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射,也可以当成类型使用,这样值只能是枚举中的值。
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
// 反向映射 根据值(依次递增)得到键名 根据键名得到值
enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Tue"] === 2); // true
// 即使中途修改了值 那么它也会重最后的一个值 往下进行反向映射
let a:Days = "Hepta" // 报错
let b:Days = Days.Sun // 以枚举作为类型值只能是枚举中的值
声名合并
- 如果定义了两个相同名字的函数、接口或类,那么它们会合并成一个类型
接口合并
interface Alarm {
price: number;
}
interface Alarm {
weight: number;
}
相当于:
interface Alarm {
price: number;
weight: number;
}
// 合并的属性的类型必须是唯一的
官方学习文档 查看详情内容