布尔类型

let isDone: boolean = false;

数字类型

数字类型包括:十进制,十六进制,二进制,八进制

let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;

字符串类型

字符串:使用单引号或者双引号表示
表达方式:可以使用模版字符串,可以定义多行文本和内嵌表达式

let userName: string = "bob";
userName = 'jjzhang';
let message: string = "Gene";
let age: number = 20;
let sentence: string = `Hello, my name is ${message}. I will be ${age + 1} years old next month`;

数组

有两种定义方式:

  • 可以再元素类型后面加上[],表示由此类型元素组成的一个数组
  • 使用数组泛型,Array
let list: number[] = [1,2,3];
let array: Array = [1,2,3];

元组Tuple

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

let tupl: [string, number];
tupl = ['hello', 10];

枚举

使用枚举类型可以为一组数值赋予友好的名字
优点:枚举提供的一个便利是可以由枚举值得到他的名字
定义:

  • 默认情况下从0开始为元素编号
  • 也可以手动指定成员的数值
  • 也可以全部采用手动赋值
enum Color { Red, Green, Blue };
let color: Color = Color.Red; // 0
let colorName: string = Color[1]; // Green

enum Balls { FootBall = 1, BasketBall, ValliBall };
let ball = Balls.BasketBall; // 2
let ballName: string = Balls[2]; // BasketBall

enum Mobiles { Xiaomi = 1, Huawei = 3, Apple = 5 };
let mobile = Mobiles.Huawei; // 3
let mibileName: string = Mobiles[3]; // Huawei

Any类型

使用场景:在编程阶段还不清楚类型的变量指定一个类型
目的:不希望在编译阶段对这些值进行类型检查
注:当只知道一部分数据类型时,可以在any后面加已知类型

let notSure: any = 4;
notSure = 'I am a string';
notSure = false;
// 必须是数组
let anyList: any[] = [1, 'free', true];
anyList[1] = 100;

Void类型

定义:某种程度上与any类型相反,表示没有任何类型,通常表示函数没有返回值
注:当用void声明一个变量时,其实意义不大,因为只能赋值:undefined跟null

function warnUser(): void {
  console.log('This is a wran message');
}
let unusable: void = undefined;

Null 和 Undefined类型

定义:undefined跟null两者各自有自己的类型分别叫做undefined跟null
注:跟void相似,他们本身的类型用处不大
场景:

  • 默认情况下null和undefined是所有类型的子类型,就是说可以把null和undefined赋值给number等所有类型
  • 当在tsconfig.json中开启 "strictNullChecks": true 时 null跟undefined只能赋值给void和他们各自
  • 官方推荐使用 "strictNullChecks": true
let undefd: undefined = undefined;
let nul: null = null;
let numb: number = undefined;
// 开启strictNullChecks时,下面方式报错
let num1: number;
num1 = undefined; // 报错

Never类型

定义:表示那些永不存在的值的类型
注意:

  • never类型是任何类型的子类型,也可以赋值给任何类型
  • 没有类型是never的子类型,所以也不能赋值给never类型,即使any也不可以赋值
 // 返回never的函数必须存在无法达到的终点
 function error(message: string): never {
   throw new Error(message);
 }
 // 推断的返回值类型为never
 function fail() {
   return error('Something failed');
 }
 // 返回never的函数必须存在无法达到的终点
 function infiniteLoop(): never {
   while(true) {}
 }

原始类型

即基本类型:number,string,boolean,symbol,null,undefined
Object类型:表示原始类型之外的类型

declare function create(o: object | null): void;
create({prop: 0}); // OK
create(null); // OK
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error

类型断言

前提:由于TS在编译是做静态推断的,所以编译阶段已经确定了每个字段的类型
目的:用来告诉编译器你比他更了解这个类型,并且可以修改这个类型
跟类型转换的区别:

  • 类型转换:转换通常意味着某种运行时的支持
  • 断言:断言纯粹是一个编译时语法,也是一种为编译器提供关于如何分析代码的方法
// 下面代码报错,是因为foo的类型被编译器推断为{},即具有零属性的对象,所以不能在他的属性上添加bar跟bas
const foo = {};
foo.bar = 123; // Error: 'bar' 属性不存在于 ‘{}’
foo.bas = 'hello'; // Error: 'bas' 属性不存在于 ‘{}’
// 可以通过断言来避免此问题
interface Foo {
  bar: number,
  bas: string
}
const foo = {} as Foo;
foo.bar = 123; // OK
foo.bas = 'hello'; // OK

断言类型的两种方式:

  • 尖括号语法
  • as 语法
// 尖括号 语法
let someValue: any = 'this is a string';
let strLength: number = (someValue).length;
// as 语法
let anyValue: any = 'this is a string';
let strLen: number = (anyValue as string).length;
// 用处
function handler(event: Event) {
  const mouseEvent = event as MouseEvent;
}
// 如果上面方式还不是报错的话,可以使用双重断言
function handle(event: Event) {
  const mouseEvt = (event as any) as MouseEvent;
}