typescript的数据类型

基本数据类型

布尔值

布尔值是最基础的数据类型,在 typescript 中,使用 boolean 定义布尔值类型:
let isDone: boolean = false;

数值

使用 number 定义数值类型:

1
2
3
4
5
6
7
8
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
// ES6 中的二进制表示法
let binaryLiteral: number = 0b1010;
// ES6 中的八进制表示法
let octalLiteral: number = 0o744;
let notANumber: number = NaN;
let infinityNumber: number = Infinity;

编译结果:

1
2
3
4
5
6
7
8
var decLiteral = 6;
var hexLiteral = 0xf00d;
// ES6 中的二进制表示法
var binaryLiteral = 10;
// ES6 中的八进制表示法
var octalLiteral = 484;
var notANumber = NaN;
var infinityNumber = Infinity;

其中 0b1010 和 0o744 是 ES6 中的二进制和八进制表示法,它们会被编译为十进制数字。

字符串

使用 string 定义字符串类型:

1
2
3
4
5
6
let myName: string = 'dingcang';
let myAge: number = 25;

// 模板字符串
let sentence: string = `Hello, my name is ${myName}.
I'll be ${myAge + 1} years old next month.`;

编译结果:

1
2
3
4
5
6
7
8
9
var myName = 'Xcat Liu';
var myAge = 25;
// 模板字符串
var sentence =
'Hello, my name is ' +
myName +
".\nI'll be " +
(myAge + 1) +
' years old next month.';

其中 ` 用来定义 ES6 中的模板字符串,${expr} 用来在模板字符串中嵌入表达式。

数组类型

数组类型有多种定义方式,比较灵活。

「类型 + 方括号」表示法

1
let fibonacci: number[] = [1, 1, 2, 3, 5];

数组泛型

1
2
let arr: Array<number> = [1, 1, 2, 3, 5];
let arr: Array<number | string> = [1, 1, 2, 3, '5'];

用接口表示数组

1
2
3
4
interface NumberArray {
[index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];

any 在数组中的应用

let list: any[] = ['Xcat Liu', 25, { website: 'http://xcatliu.com' }];

类数组

元组 Tuple

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

1
2
let a: [number, string];
a = [1, '2'];

空值

用 void 表示没有任何返回值的函数:

1
2
3
function alertName(): void {
alert('My name is dc');
}

声明的 void 类型的变量只能赋值为 undefined 和 null:

1
let unusable: void = undefined;

null 和 undefined

使用 null 和 undefined 来定义这两个原始数据类型:

1
2
let u: undefined = undefined;
let n: null = null;

请注意:

  • undefined 类型的变量只能被赋值为 undefined,null 类型的变量只能被赋值为 null。
  • 与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量。

任意值

任意值(Any)用来表示允许赋值为任意类型。

1
2
let myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7;

any 类型允许被赋值为任意类型

变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型。

类型推论

typeScript 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。

1
2
3
4
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.

联合类型

联合类型使用 | 分隔每个类型。

1
2
3
let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
  • 这里的 string | number 的含义是,允许 myFavoriteNumber 的类型是 string 或者 number,但是不能是其他类型
  • 当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法。

接口

使用接口(Interfaces)来定义对象的类型。

1
2
3
4
5
6
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
  • 接口一般首字母大写。
  • readonly 为只读属性
  • name 为确定属性
  • age 为可选属性
  • [propName: string]为任意属性

需要注意的是,一旦定义了任意属性,那么确定属性和可选属性都必须是它的子属性

函数类型