TypeScript类型系统和基础类型

类型系统

相对于与ES6来说,TypeScript中最大的改善就是增加了类型系统,这极大的简化了我们的开发工作。类型系统会对数据进行类型检查,以避免不必要的错误。
类型检查的好处有:

  • 有助于代码的编写,因为它可以在编译期预防bug
  • 有助于代码的阅读,因为它可以清晰地表达我们的意图

使用的方法

1. 在声明变量时,可以规定变量所需要的变量类型
语法规则:

变量声明 变量名:类型;

e.g.

var name:string;
let age:number;
const male:boolean;

当然你也可以赋值:

var name:string='张三';
let age:number=18;
const male:boolean=true;

如果你输入了错误的期望值,那么会报错:

var job:string=true;
//Type 'true' is not assignable to type 'string'.

数组指定变量类型的方式有点儿不一样,本文下面会有详细介绍。

2.在声明函数时,可以为函数参数和返回值指定类型:
语法规则:

function 函数名(变量名:形参类型):返回值类型{}

e.g.

function greet(name:string):string{
    return "hello"+name;
}

如果你输入了错误的参数,那么会报错:

greet(18);
//Argument of type '18' is not assignable to parameter of type 'string'.

基础类型

TS的基础类型有除了有我们所熟悉的Boolean、Number、String、Array、null 和 undefined,还有新增了enum、any、void、never。

Boolean 布尔类型

布尔类型只有true(真)和false(假)两个值。

var male:boolean=true;

Number数字类型

TS所有的数字都是由浮点数表示的,这些数字的类型就是number。

var age:number=18;

String 字符串类型

string表示文本数据类型。 和JavaScript一样,可以使用双引号( “)或单引号(’)表示字符串。

var name:string = "张三";

你还可以使用模板字符串 它可以定义多行文本内嵌表达式。 这种字符串是被反引号包围( `),并且以${ expr}这种形式嵌入表达式

模板字符串 让我们不必在字符串换行时加上愚蠢的”+”号了,这增加了代码的可读性。

let person:string=`张三今年18;
性别:男;
工作是web前端。`
console.log(person);
//张三今年18;
//性别:男;
//工作是web前端。  

嵌入表达式 则提高了我们代码编写的速率,让代码结构更加清晰。

let name:string="张三";
let greet:string=`你好呀~${name}`
console.log(greet);//你好呀~张三

Array 数组类型

如果数组是一组相同数据类型的集合,那么这个数组有两种方式来指定数据类型。

语法规则:

  1. 数组-类型方式(又名数组泛型):Array
  2. 类型-数组方式:type[]
//数组-类型方式:
    var skills:Array<string>=['ES5','ES6','Angular','Node.js'];
//类型-数组方式:  
    var hobbies:string[]=['前端','轻音乐','电竞','游泳'];

//使用ES6的箭头函数,遍历输出skills的所有值。
    skills.forEach(x=>console.log(x))
//ES5
//ES6
//Angular
//Node.js
    hobbies.forEach(x=>console.log(x))
//前端
//轻音乐
//电竞
//游泳

箭头函数是一种快速书写函数的简洁语法,本系列其他文章我们会详细讲解。

如果数组中的元素数据类型不相同,我们可以称之为元组(Tuple)。

语法规则:
[type1, type2…typeX]

let x:[string,number,boolean];
x=["hello",1,true];
console.log(x[0])//hello

x=[1,1,1];//报错
//Type '[number, number, 1]' is not assignable to type '[string, number, boolean]'.
//Type 'number' is not assignable to type 'string'.

枚举类型

枚举类型是一组可以命名数值的集合。使用枚举类型可以为一组数值赋予友好的名字。
默认情况下,从0开始为元素编号:

enum color {red,green,blue};
let c:color=color.green;
console.log(c)//1

当然我们也可以从1(或者其他数)开始编号:

enum color {red=1,green,blue};
let c:color=color.green;
console.log(c)//2

再或者全部手动赋值:

enum color {red=1,green=3,blue=5};
let c:color=color.green;
console.log(c)//3

元素编号是递增的,指定元素编号的下一个元素总是比指定元素编号要大1。(如果下个元素没指定编号的话)

enum color {red=1,green=3,blue};
let c:color=color.blue;
console.log(c)//4

同样,我们可以通过元素编号来获取元素

enum color {red,green,blue};
let c=color[2];
console.log(c)//blue

Any类型

如果我们没有为变量指定类型的话,那么它的默认类型就是any。在TS中,any表示可以接受任何类型的数据:

var something;
//这样的声明等同于
var something:any;

Void类型

void类型(又称为“无”类型)表示我们不期望有类型。一般用于函数的返回值,表示没有任何返回值。

function shopping(name:string):void{
    //some codes
    }

null和Undefined类型

在TS中,undefined和null两者各自有自己的类型分别叫做undefined和null。

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

默认情况下null和undefined是所有类型的子类型。 就是说你可以把 null和undefined赋值给number类型的变量。

Never类型

never类型表示的是那么些永远不存在的值的类型。更加通俗的讲,就是那些总是会抛出异常或者根本就不会有返回值的函数

变量也可能是 never类型,当它们被永不为真的类型保护所约束时。

never的特性:

  • never 是任何类型的子类型, 并且可以赋值给任何类型.
  • 没有类型是 never 的子类型或者可以复制给 never (除了 never 本身).
  • 在一个没有返回值标注的函数表达式或箭头函数中, 如果函数没有 return 语句, 或者仅有表达式类型为 never 的 return
    语句, 并且函数的终止点无法被执行到 (按照控制流分析), 则推导出的函数返回值类型是 never.
  • 在一个明确指定了 never 返回值类型的函数中, 所有 return 语句 (如果有) 表达式的值必须为 never 类型,且函数不应能执行到终止点.
// 返回never的函数必须存在无法达到的终点(抛出异常,程序提前终止)
function error(message:string): never {
    throw new Error(message);
}

// 推断的返回值类型为never(永远不可能执行到最后)
function fail(direction:boolean) {
  if(direction){
    return 1;
    }else{
    return -1;
    }
   return error("永远不应该到这里");
}

// 返回never的函数必须存在无法达到的终点(死循环,程序不会终止)
function infiniteLoop(): never {
    while (true) {
    }
}

never类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。
即使 any也不可以赋值给never。

参考资料:
TS官网
TypeScript 2.0 新特性一览
《Angular权威教程》

上一篇:完整性检查


下一篇:TypeScript学习笔记--数据类型