TypeScript - 类型系统

TypeScript - 类型系统

[TOC]

学习目标

  • 了解类型系统
    • 类型标注
    • 类型检测的好处
    • 使用场景
  • 掌握常用的类型标注的使用

类型系统

简单来说类型系统包含:

  • 类型标注(签名)
  • 类型检测

类型标注

类型标注就是给数据(变量、函数、类等)添加类型说明

类型标注语法:

变量: 标注类型

let 变量: 数据类型;

类型检测

有了类型标注,编译器会在编译过程中根据标注的类型进行检测,使数据的使用更安全,帮助我们减少错误

同时配合 编辑器/IDE ,类型标注还能提供更加强大和友好的智能提示

<span style="color:red">注意:类型系统检测的是类型,而不是具体值,即 数据是否与标注的类型一致</span>

标注类型有哪些?

  • 基础类型
  • 空和未定义类型
  • 对象类型
  • 数组类型
  • 元组类型
  • 枚举类型
  • 无值类型
  • Never类型
  • 任意类型
  • 未知类型(Version3.0 Added)

基础类型

基础类型包含:string,number,boolean

标注语法

变量: string;
变量: number;
变量: boolean;
let title: string = '开课吧';
let n: number = 100;
let isOk: boolean = true;

title = 100;    //错误

空和未定义类型

因为在 Null 和 Undefined 这两种类型有且只有一个值,在标注一个变量为 Null 和 Undefined 类型,那就表示该变量不能修改了

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

如果一个变量声明了,但是未赋值,那么该变量的值为 undefined,但是如果它同时也没有标注类型的话,默认类型为 any,any 类型后面有详细说明

let un: undefined;
un = 1; // 错误
let nul: null;
nul = 1; //错误
let a: string = '开课吧';
a = null; // 可以
a = undefined; // 可以

小技巧:指定 strictNullChecks 配置为 true,可以有效的检测 null 值数据,避免很多常见问题,建议对可能出现的 null 和 undefined 进行容错处理,使程序更加严谨

let ele = document.querySelector('#box');
if (ele) {
      ele.style.display = 'none';
}

对象类型

Object 类型表示非原始值类型

标注语法

变量: object

基于对象字面量的类型标注

let ot: {x: number, y: string} = {
    x: 1,
    y: 'zmouse'
};

针对对象这种特殊而有复杂的数据,TypeScript 有许多的方式来进行类型标注

内置对象类型

除了 Object 类型,在 JavaScript 中还有很多的内置对象,如:Date,标注如下:

变量: 内置对象构造函数名
let d1: Date = new Date();
let set1: Set = new Set();

包装对象

这里说的包装对象其实就是 JavaScript 中的 String、Number、Boolean,我们知道 string 类型 和 String 类型并不一样,在 TypeScript 中也是一样

let a: string;
a = '1';
a = new String('1');    // 错误

let b: String;
b = new String('2');
b = '2';    // 正确

数组类型

TypeScript 中的数组存储的类型必须一致,所以在标注数组类型的时候,同时要标注数组中存储的数据类型

标注语法

变量: 类型[]

数组还有另外一种基于 泛型 的标注

变量: Array<类型>

let arr1: string[] = [];
arr1.push('开课吧'); // 正确
arr1.push(1); // 错误

let arr2: Array<number> = [];
arr2.push(100); // 正确
arr2.push('开课吧'); // 错误

元组类型

元组类似数组,但是存储的元素类型不必相同,但是需要注意:

  • 初始化数据的个数以及对应位置标注类型必须一致
  • 越界数据必须是元组标注中的类型之一(标注越界数据可以不用对应顺序 - 联合类型)

标注语法

变量: [类型一, 类型二,...]
let data1: [string, number] = ['开课吧', 100];
data1.push(100); // 正确
data1.push('100'); // 正确
data1.push(true); // 错误

注意:未开启 strictNullChecks: true 会使用 undefined 进行初始化

枚举类型

枚举的作用组织收集一组关联数据的方式

标注语法

enum 枚举名称 { key1=value, key2=value2 }
  • key 不能是数字
  • value 可以是数字,称为 数字类型枚举,也可以是字符串,称为 字符串类型枚举,但不能是其它值,默认为数字:0
  • 第一个枚举值或者前一个枚举值为数字时,可以省略赋值,其值为 前一个数字值 + 1

数字类型枚举

enum HTTP_CODE {
    OK = 200,
    NOT_FOUND = 404
};
HTTP_CODE.OK    //200

字符串类型枚举

enum URLS  {
    USER_REGISETER = '/user/register',
    USER_LOGIN = '/user/login'
}

无值类型

表示没有任何数据的类型,通常用于标注无返回值函数的返回值类型,函数默认标注类型位:void

标注语法

变量: void
function fn():void {
    // 没有 return
}

Never类型

当一个函数永远不可能执行 return 的时候,返回的就是 never ,与 void 不同,void 是执行了 return, 只是没有值,never 是不会执行 return,比如抛出错误,导致函数终止执行

function fn(): never {
    throw new Error('error');
}
  • never 类型是所有其它类型的子类
  • 其它不能赋值给 never 类型,即使是 any

任意类型

有的时候,我们并不确定这个值到底是什么类型或者不需要对该值进行类型检测,就可以标注为 any 类型

  • 任何值都可以赋值给 any 类型
  • any 类型也可以赋值给任意类型
  • any 类型有任意属性和方法

标注语法

变量: any

注意:标注为 any 类型,也意味着放弃对该值的类型检测,同时放弃 IDE 的智能提示

小技巧:指定 noImplicitAny 配置为 true,当函数参数出现隐含的 any 类型时报错

未知类型

unknow,3.0 版本中新增,属于安全版的 any,但是与 any 不同的是:

  • unknow 仅能赋值给 unknow、any
  • unknow 没有任何属性和方法

标注语法

变量: unknow;

函数类型

在 JavaScript 中函数是一等公民的存在,在 TypeScript 也是如此,同样的,函数也有自己的类型标注格式

函数名称( 参数1: 类型, 参数2: 类型... ): 返回值类型;
function add(x: number, y: number): number {
    return x + y;
}

总结

  • 类型标注语法
  • 基础类型标注
    • 字符串、数字、布尔值、空、未定义
  • 非基础类型标注
    • 对象、数组
  • 特殊类型
    • 元组、枚举、无值类型、Never类型、任意类型、未知类型
  • 包装对象
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342