Skip to main content

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

表示逻辑值:truefalse

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, nullvoid 类型的值(如果 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 能被赋值为任何类型,但不能被赋值给除了 anyunknown 之外的其他类型;同时,不允许执行 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
any 和 unknown 的区别

任何类型都能分配给 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 是其它类型(包括 nullundefined)的子类型,代表从不会出现的值,这意味着声明为 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');
}
}