3. 数据类型
3.1 布尔类型(boolean)
let married: boolean=false;
3.2 数字类型(number)
let age: number=10;
3.3 字符串类型(string)
let firstname: string='zfpx';
3.4 数组类型(array)
let arr2: number[]=[4,5,6];
let arr3: Array<number>=[7,8,9];
3.5 元组类型(tuple)
- 在 TypeScript 的基础类型中,元组( Tuple )表示一个已知数量和类型的数组
let zhufeng:[string,number] = ['zhufeng',5];
zhufeng[0].length;
zhufeng[1].toFixed(2);
| 元组 | 数组 |
| --- | --- |
| 每一项可以是不同的类型 |每一项都是同一种类型 |
| 有预定义的长度 | 没有长度限制 |
| 用于表示一个固定的结构 | 用于表示一个列表 |
const animal:[string,number,boolean] = ['zhufeng',10,true];
3.6 枚举类型(enum)
-
事先考虑某一个变量的所有的可能的值,尽量用自然语言中的单词表示它的每一个值
-
比如性别、月份、星期、颜色、单位、学历
let married: boolean=false;
3.6.1 普通枚举
enum Gender{
GIRL,
BOY
}
console.log(`李雷是${Gender.BOY}`);
console.log(`韩梅梅是${Gender.GIRL}`);
enum Week{
MONDAY=1,
TUESDAY=2
}
console.log(`今天是星期${Week.MONDAY}`);
3.6.2 常数枚举
-
常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员。
-
假如包含了计算成员,则会在编译阶段报错
const enum Colors {
Red,
Yellow,
Blue
}
let myColors = [Colors.Red, Colors.Yellow, Colors.Blue];
const enum Color {Red, Yellow, Blue = "blue".length};
3.7 任意类型(any)
-
any就是可以赋值给任意类型
-
第三方库没有提供类型文件时可以使用any
-
类型转换遇到困难时
-
数据结构太复杂难以定义
let root:any=document.getElementById('root');
root.style.color='red';
let root:(HTMLElement|null)=document.getElementById('root');
root!.style.color='red';//非空断言操作符
3.8 null 和 undefined
-
null 和 undefined 是其它类型的子类型,可以赋值给其它类型,如数字类型,此时,赋值后的类型会变成 null 或 undefined
-
strictNullChecks 参数用于新的严格空检查模式,在严格空检查模式下, null 和 undefined 值都不属于任何一个类型,它们只能赋值给自己这种类型或者 any
let x: number;
x = 1;
x = undefined;
x = null;
let y: number | null | undefined;
y = 1;
y = undefined;
y = null;
3.9 void 类型
-
void 表示没有任何类型
-
当一个函数没有返回值时,TS 会认为它的返回值是 void 类型。
function greeting(name:string):void {
console.log('hello',name);
//当我们声明一个变量类型是 void 的时候,它的非严格模式(strictNullChecks:false)下仅可以被赋值为 null 和 undefined
//严格模式(strictNullChecks:true)下只能返回undefined
//return null;
//return undefined;
}
3.10 never类型
never是其它类型(null undefined)的子类型,代表不会出现的值
3.10.1
- 作为不会返回( return )的函数的返回值类型
// 返回never的函数 必须存在 无法达到( unreachable ) 的终点
function error(message: string): never {
throw new Error(message);
}
let result1 = error('hello');
// 由类型推论得到返回值为 never
function fail() {
return error("Something failed");
}
let result = fail();
// 返回never的函数 必须存在 无法达到( unreachable ) 的终点
function infiniteLoop(): never {
while (true) {}
}
3.10.2 strictNullChecks
-
在 TS 中, null 和 undefined 是任何类型的有效值,所以无法正确地检测它们是否被错误地使用。于是 TS 引入了 --strictNullChecks 这一种检查模式
-
由于引入了 --strictNullChecks ,在这一模式下,null 和 undefined 能被检测到。所以 TS 需要一种新的底部类型( bottom type )。所以就引入了 never。
// Compiled with --strictNullChecks
function fn(x: number | string) {
if (typeof x === 'number') {
// x: number 类型
} else if (typeof x === 'string') {
// x: string 类型
} else {
// x: never 类型
// --strictNullChecks 模式下,这里的代码将不会被执行,x 无法被观察
}
}
3.10.3 never 和 void 的区别
-
void 可以被赋值为 null 和 undefined的类型。 never 则是一个不包含值的类型。
-
拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常。'
3.11 Symbol
-
我们在使用 Symbol 的时候,必须添加 es6 的编译辅助库
-
Symbol 是在ES2015之后成为新的原始类型,它通过 Symbol 构造函数创建
-
Symbol 的值是唯一不变的
const sym1 = Symbol('key');
const sym2 = Symbol('key');
Symbol('key') === Symbol('key') // false
3.12 BigInt
-
使用 BigInt 可以安全地存储和操作大整数
-
我们在使用 BigInt 的时候,必须添加 ESNext 的编译辅助库
-
要使用1n需要 "target": "ESNext"
-
number和 BigInt类型不一样,不兼容
const max = Number.MAX_SAFE_INTEGER;// 2**53-1
console.log(max + 1 === max + 2);
const max = BigInt(Number.MAX_SAFE_INTEGER);
console.log(max + 1n === max + 2n);
let foo: number;
let bar: bigint;
foo =bar;
bar = foo;
3.13 类型推论
-
是指编程语言中能够自动推导出值的类型的能力,它是一些强静态类型语言中出现的特性
-
定义时未赋值就会推论成any类型
-
如果定义的时候就赋值就能利用到类型推论
let username2;
username2 = 10;
username2 = 'zhufeng';
username2 = null;
3.14 包装对象(Wrapper Object)
-
JavaScript 的类型分为两种:原始数据类型(Primitive data types)和对象类型(Object types)。
-
所有的原始数据类型都没有属性(property)
-
原始数据类型
-
布尔值
-
数值
-
字符串
-
null
-
undefined
-
Symbol
let name = 'zhufeng';
console.log(name.toUpperCase());
console.log((new String('zhufeng')).toUpperCase());
- 当调用基本数据类型方法的时候,JavaScript 会在原始数据类型和对象类型之间做一个迅速的强制性切换
let isOK: boolean = true; // 编译通过
let isOK: boolean = Boolean(1) // 编译通过
let isOK: boolean = new Boolean(1); // 编译失败 期望的 isOK 是一个原始数据类型
3.15 联合类型
-
联合类型(Union Types)表示取值可以为多种类型中的一种
-
未赋值时联合类型上只能访问两个类型共有的属性和方法
let name: string | number;
console.log(name.toString());
name = 3;
console.log(name.toFixed(2));
name = 'zhufeng';
console.log(name.length);
export {};
3.16 类型断言
-
类型断言可以将一个联合类型的变量,指定为一个更加具体的类型
-
不能将联合类型断言为不存在的类型
let name: string | number;
console.log((name as string).length);
console.log((name as number).toFixed(2));
console.log((name as boolean));
- 双重断言
interface Person {
name: string;
age: number;
}
const person = 'zhufeng' as any as Person; // ok
3.17 字面量类型和类型字面量
-
字面量类型的要和实际的值的字面量一一对应,如果不一致就会报错
-
类型字面量和对象字面量的语法很相似
const up:'Up'= 'Up';
const down: "Down" = "Down";
const left: "Left" = "Left";
const right: "Right" = "Right";
type Direction = 'Up' | 'Down' | 'Left' | 'Right';
function move(direction: Direction) {}
move("Up");
type Person = {
name:string,
age:number
};
3.18 字符串字面量 vs 联合类型
-
字符串字面量类型用来约束取值只能是某几个字符串中的一个, 联合类型(Union Types)表示取值可以为多种类型中的一种
-
字符串字面量 限定了使用该字面量的地方仅接受特定的值,联合类型 对于值并没有限定,仅仅限定值的类型需要保持一致