数据类型
布尔类型
let isBooked: boolean = false
数字类型
let age: number = 10
字符串类型
let myName: string = 'name'
数组类型
let myFriends: string[] = ['bb','sb']
元组类型
元组表示一个已知数量和类型的数组
let memory: [string,number] = ['apple',5]
元组和数组的区别
| 元组 | 数组 |
|---|---|
| 每一项可以是不同的类型 | 每一项都是同一种类型 |
| 有预定义的长度 | 没有长度限制 |
| 用于表示一个结构 | 用于表示一个列表 |
枚举类型
- 事先考虑某一个变量的所有的可能的值,尽量用自然语言中的单词表示它的每一个值
- 比如性别、月份、星期、颜色、单位、学历
普通枚举
enum Gender{
GIRL,
BOY
}
console.log(`李雷是${Gender.BOY}`);
console.log(`韩梅梅是${Gender.GIRL}`);
enum Week{
MONDAY=1,
TUESDAY=2
}
console.log(`今天是星期${Week.MONDAY}`);
常数枚举
const enum Colors {
Red,
Yellow,
Blue
}
let myColors = [Colors.Red, Colors.Yellow,Colors.Blue]
任意类型
什么时候用:
- any就是可以赋值给任意类型
- 第三方库没有提供类型文件时可以使用any
- 类型转换遇到困难时
- 数据结构太复杂难以定义
let root:any = document.getElementById('root');
root.style.color = 'red'
null和undefined
- null和undefined是其它类型的子类型,可以赋值给其它类型,如数字类型,此时,赋值后的类型会变成null或undefined
- strictNullChecks
let x: number;
x = 1;
x = undefined;
x = null;
let y: number | null | undefined;
y = 1;
y = undefined;
y = null;
void类型
- void表示没有任何类型
- 当一个函数没有返回值时,TS会认为它的返回值是void类型。
- 当我们声明一个变量类型是void的时候,它的非严格模式下仅可以赋值为null和undefined
never类型
never是其它类型(null undefined)的子类型,代表不会出现的值
作为不会返回( return )的函数的返回值类型
// 返回never的函数 必须存在 无法达到( unreachable ) 的终点
function error(message: string): never {
throw new Error(message);
}
// 由类型推论得到返回值为 never
function fail() {
return error("Something failed");
}
// 返回never的函数 必须存在 无法达到( unreachable ) 的终点
function infiniteLoop(): never {
while (true) {}
}
strictNullChecks
- 在 TS 中, null 和 undefined 是任何类型的有效值,所以无法正确地检测它们是否被错误地使用。于是 TS 引入了 --strictNullChecks 这一种检查模式
- 由于引入了 --strictNullChecks ,在这一模式下,null 和 undefined 能被检测到。所以 TS 需要一种新的底部类型( bottom type )。所以就引入了 never。
never和void的区别
- void可以被赋值为null和undefined的类型。never则是一个不包含值的类型
- 拥有void返回值类型的函数能正常运行。拥有never返回值类型的函数无法正常返回,无法终止,或会抛出异常
类型推论
- 是指编程语言中能够自动推导出值的类型的能力,它是一些强静态类型语言中出现的特性
- 定义时未赋值就会推论成any类型
- 如果定义的时候就赋值就能利用到类型推论
包装对象
- JavaScript 的类型分为两种:原始数据类型(Primitive data types)和对象类型(Object types)。
- 所有的原始数据类型都没有属性(property)
- 原始数据类型
- 布尔值
- 数值
- 字符串
- null
- undefined
- Symbol
联合类型
- 联合类型上只能访问两个类型共有的属性和方法
let name4: string | number;
name4 = 3;
name4 = 'zhufeng';
console.log(name4.toUpperCase());
类型断言
- 类型断言可以将一个联合类型的变量,指定为一个更加具体的类型
- 不能将联合类型断言为不存在的类型
let name5: string | number;
(name5 as number).toFixed(3);
(name5 as string).length;
(name5 as boolean); //不行
字符串、数字、布尔值字面量
type Lucky = 1 | 'One'|true;
let foo:Lucky = 'One';
字符串字面量 vs 联合类型
- 字符串字面量类型用来约束取值只能是某几个字符串中的一个, 联合类型(Union Types)表示取值可以为多种类型中的一种
- 字符串字面量 限定了使用该字面量的地方仅接受特定的值,联合类型 对于值并没有限定,仅仅限定值的类型需要保持一致