TS 基础类型
一、TypeScript 的安装及使用
1、安装
npm i typescript -g // ts 全局包
npm i ts-node -g // 使用 ts-node 直接运行 ts 文件
2、使用
将 TypeScript 转换为 JavaScript 代码:
tsc test.ts
使用 node 命令来执行 test.js 文件:
node test.js
二、TypeScript 基础类型
1、任意类型 any
声明为 any
的变量可以赋予任意类型的值。
let any1: any = 4
console.log(any1); // 4
any1 = false
console.log(any1); // false
any1 = undefined
console.log(any1); // undefined
2、数字类型 number
TS 的 number
类型继承了 ES6 的 number
,额外支持二进制和八进制数值。
let decLiteral: number = 6; // 十进制
let hexLiteral: number = 0xf00d; // 16进制
let binaryLiteral: number = 0b1010; // 二进制
let octalLiteral: number = 0o744; // 八进制
console.log(decLiteral, hexLiteral, binaryLiteral, octalLiteral)
// 输出
// 6 61453 10 484
3、字符串类型 string
可以使用单引号(')、双引号(")来表示字符串类型。
使用反引号(`)来定义多行文本和内嵌表达式。
let name: string = "Tim";
let title: string = `Hello, I am ${ name }`;
4、布尔类型 boolean
表示逻辑值:true
和 false
let flag: boolean = true;
5、数组类型
声明变量为数组。
// 在元素类型后面加上 []
let arr: number[] = [1, 2, 3];
// 或者使用数组泛型
let arr: Array<number> = [1, 2, 3];
6、元组
元组与数组相似,但元组每一项的数据类型可以不同(而数组需要使用 any
类型才可以实现每一项类型不同)
let x: [string, number];
x = ['Tim', 1]; // 运行正常
x = [1, 'Tim']; // 报错
console.log(x[0]); // 输出 Tim
7、枚举类型 enum
用于定义数值集合。
enum Color {Red, Green, Blue};
let c: Color = Color.Blue;
console.log(c); // 输出 2
8、void
表示没有任何类型,与 any
相反,方法无返回值时可以使用此类型。
function hello(): void {
alert("Hello Tim");
}
变量也可以申明为 void
类型,但只能给这个变量分配 undefined
, null
和 void
类型的值(如果 ts 配置文件中设置了 "strictNullChecks": false
,那么分配 null
类型的值也会报错)
let val1: void;
let val2: null = null;
let val3: undefined = undefined;
let val4: void;
val1 = val2; // "strictNullChecks": false 时报错
val1 = val3;
val1 = val4;
9、null
表示对象值缺失。
let a: undefined = undefined
console.log(a); // undefined
10、undefined
用于初始化变量为一个未定义的值。
let b: null = null
console.log(b); // null
11、unknown
表示未知类型,是 Typescript 3.0 中引入的新类型,即写代码时还不清楚会得到怎样的数据类型,如服务器接口返回的数据,JSON.parse()
返回的结果等;
unknown
相当于 any
,可以理解为官方指定替代 any
类型的安全版本(因为不提倡直接使用 any
类型)
unknown
能被赋值为任何类型,但不能被赋值给除了 any
和 unknown
之外的其他类型;同时,不允许执行 unknown
类型变量的方法(any
可以),举个例子:
let uk: unknown = 'abc';
uk = 123;
uk = true;
uk.toString(); // Error
let valAny: any = 'abc';
valAny.toString(); // 'abc'
let uk1: unknown = uk;
let uk2: any = uk;
let uk2: string = uk; // Error
任何类型都能分配给 unknown
,但 unknown
不能分配给其他基本类型,而 any
任何类型能分配和被分配。
let foo: unknown
foo = true // √
foo = 123 // √
foo.toFixed(2) // error
let foo1: string = foo // error
let bar: any
bar = true // √
bar = 123 // √
foo.toFixed(2) // √
let bar1: string = bar // √
可以看到,用了 any
就相当于完全丢失了类型检查,所以尽量少用 any
,对于未知类型可以用 unknown
。
12、never
never
是其它类型(包括 null
和 undefined
)的子类型,代表从不会出现的值,这意味着声明为 never
类型的变量只能被 never
类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环)
// 场景一
let x: never;
x = 123; // 运行错误,数字类型不能转为 never 类型
// 场景二
function err(msg: string): never {
throw new Error(msg);
}
// 有机会到达终点的函数也算存在返回值,编译会报错
function err1(): never { // Error
if (Math.random() > 0.5) {
throw new Error('message');
}
}