TypeScript 入门教程学习笔记

1. 数据类型定义

类型 实例 说明
Number let num: number = 1; 基本类型
String let myName: string = 'Tom';
Boolean let isDone: boolean = false;
Array let arr: number[] = [1, 1, 2, 3, 5]; 用 any 表示数组中允许出现任意类型
Function 1. 函数声明


function sum(x: number, y: number): number {


  return x + y;


}


2. 函数表达式


let mySum: (x: number, y: number) => number = function (x: number, y: number): number {


  return x + y;


};
重载:返回值有多个类型时,可以使用重载定义多个函数类型,如:


function reverse(x: number): number;


function reverse(x: string): string;


function reverse(x: number | string): number | string {


 if (typeof x === 'number') {


  return Number(x.toString().split('').reverse().join(''));


 } else if (typeof x === 'string') {


  return x.split('').reverse().join('');


 }


}


TypeScript 会优先从最前面的函数定义开始匹配
Object 接口 参见下面详细内容
联合类型 let idNumber: string | number; 1. 联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型


2. 当不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型中共有的属性或方法
内置对象 1. ECMAScript 的内置对象:Boolean、Error、Date、RegExp 等。


2. DOM 和 BOM 的内置对象:Document、HTMLElement、Event、NodeList 等。

let d: Date = new Date();


let r: RegExp = /[a-z]/;


function run() {


 let args: IArguments = arguments;


}
备注 1. undefined 和 null 是所有类型的子类型。


2. 忽略类型,使用any。

类型推论:TypeScript 会在没有明确的指定类型的时候推测出一个类型

2. 对象的类型——接口

接口使用 interface 来定义,

用于对类的一部分行为进行抽象,也常用于对「对象的形状(Shape)」进行描述。

2.1 定义简单对象

interface Person {
readonly id: number; // 只读属性
name: string;
age?: number; // 可选属性
[propName: string]: any; // 任意属性,any这个地方影响其他所有属性类型判断
} let tom: Person = {
id: 89757,
name: 'Tom',
age: 25,
gender: 'male'
};

2.2 定义数组

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

一般不会这么做,因为这种方式很复杂,丢弃了数组的方法。

2.3 定义函数

interface SearchFunc {
(source: string, subString: string): boolean;
} let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
return source.search(subString) !== -1;
}

3. 断言

语法

断言有两种语法:值 as 类型<类型>值,常用第一种。

为什么需要断言

1. 将一个联合类型断言为其中一个类型

当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型中共有的属性或方法,而有时候,我们确实需要在还不确定类型的时候就访问其中一个类型特有的属性或方法

2. 将一个父类断言为更加具体的子类

当类之间有继承关系时,类型断言也是很常见的

3. 将任何一个类型断言为 any

一方面不能滥用 as any,另一方面也不要完全否定它的作用,我们需要在类型的严格性和开发的便利性之间掌握平衡

4. 将 any 断言为一个具体的类型

遇到 any 类型的变量时,最好能够将调用了它之后的返回值断言成一个精确的类型,这样就方便了后续的操作

  • 要使得 A 能够被断言为 B,只需要 A 兼容 B 或 B 兼容 A 即可
  • 除非迫不得已,千万别用双重断言
  • 类型声明是比类型断言更加严格的,所以为了增加代码的质量,我们最好优先使用类型声明,这也比类型断言的 as 语法更加优雅。

3. 声明文件

由于ts不能识别通过 <script> 标签引入的第三方库对象,需要定义引入的第三方全局变量类型,

声明语句为:

declare var jQuery: (selector: string) => any;

通常把声明语句放到一个单独的文件(jQuery.d.ts)中,以 .d.ts 为后缀。

推荐使用 @types 统一管理第三方库的声明文件

npm install @types/jquery --save-dev

书写声明文件

  1. 创建一个 types 目录,专门用来管理自己写的声明文件
  2. 配置下 tsconfig.json 中的 paths 和 baseUrl 字段

tsconfig.json 内容:

{
"compilerOptions": {
"module": "commonjs",
"baseUrl": "./",
"paths": {
"*": ["types/*"]
}
}
}

4. 类型别名和字符串字面量类型

类型别名和字符串字面量类型都使用 type 定义

类型别名

类型别名可以给类型起一个名字,类型可以是一个也可以是多个

type Name = string | number;

let idNumber: Name = '001';

idNumber = 100;

字符串字面量类型

字符串字面量类型用来约束取值只能是某几个字符串中的一个

type EventNames = 'click' | 'scroll' | 'mousemove';

5. 元组

let tom: [string, number] = ['Tom', 25];

6. 枚举

枚举(Enum)类型用于取值被限定在一定范围内的场景

enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

编译后得到的js文件

var Days;
(function (Days) {
Days[Days["Sun"] = 0] = "Sun";
Days[Days["Mon"] = 1] = "Mon";
Days[Days["Tue"] = 2] = "Tue";
Days[Days["Wed"] = 3] = "Wed";
Days[Days["Thu"] = 4] = "Thu";
Days[Days["Fri"] = 5] = "Fri";
Days[Days["Sat"] = 6] = "Sat";
})(Days || (Days = {}));

打印 Days 来看一看结构

{
"0": "Sun",
"1": "Mon",
"2": "Tue",
"3": "Wed",
"4": "Thu",
"5": "Fri",
"6": "Sat",
"Sun": 0,
"Mon": 1,
"Tue": 2,
"Wed": 3,
"Thu": 4,
"Fri": 5,
"Sat": 6
}

枚举项有两种类型:常数项计算所得项,计算所得项后的项无法自动获取初始值。

用到枚举的场景

枚举用来让代码更加语义化,比如有一条数据,0 代表停用, 1 代表启用

{ status: 0 }

你并不能很好的确定status为0是什么状态,使用enums能更清楚的知道是什么状态

enum Status = {disabled: 0, enabled: 1};

const data = {status: Status.disabled};

参考自:TypeScript 入门教程

TypeScript 入门教程学习笔记的更多相关文章

  1. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  2. Git 极简入门教程学习笔记

    Git 极简入门教程  http://rogerdudler.github.io/git-guide/index.zh.html 测试用 https://github.com/xxx/BrnShop. ...

  3. 《TypeScript入门教程》笔记

    基础 原始数据类型 布尔值 let isDone: boolean = false; 数值 let decLiteral: number = 6; 字符串 let myName: string = ' ...

  4. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

  5. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  6. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...

  7. 尚硅谷韩顺平Linux教程学习笔记

    目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...

  8. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  9. JProfiler使用详细教程学习笔记

    JProfiler学习笔记    推荐文章:JProfiler 入门教程 一.安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请 ...

随机推荐

  1. 学习笔记之Python人机交互小项目一:名字管理系统

    2020是一个不平凡的一年,但即使挫折不断,我们每学期的课程实训也没有受到影响,仍旧如期实施.与往年不同的是,今年的实训老师是学校邀请的公司在职人员来给我们实训.今年实训的内容是Python语言,下面 ...

  2. flume将数据写入各个组件

    一.flume集成hdfs,将数据写入到hdfs           a1.sources = r1           a1.sinks = k1           a1.channels = c ...

  3. Game of Sum

    可以知道整体石子的总和一定的,所以一个人的得分越高,另一个人的得分就越低.不管怎么取任意时刻游戏的状态都是原始序列的一段连续子序列(即被玩家取剩下的序列). 因此,用d(i,j)表示玩家A在i到j部分 ...

  4. vue 过滤器 filter 的使用

    1.局部过滤器的使用 比如性别,订单状态的数据,后端一般返回数字来代替状态.以性别为模拟数据,0是未知,1是男,2是女. 直接数据渲染出来,只有012,没有性别 根据后端返回的int类型值,前端对数据 ...

  5. String -- 从源码剖析String类

    几乎所有的 Java 面试都是以 String 开始的,String 源码属于所有源码中最基础.最简单的一个,对 String 源码的理解也反应了你的 Java 基础功底. String 是如何实现的 ...

  6. IP包头分析

    • IP包头是IP协议(网络层,第三层)为数据包添加的头部.        ○ 格式:        ○ ○ 拆开看,每行是4+4+8+16=32bit=4Byte        ○ ip协议最短20 ...

  7. mongodb表索引备份,索引的导出导入

    背景 发现有两个mongodb环境的数据库表索引不一致,另一个数据库有索引缺失,需要将一个数据库里的所有表索引导入到另一个数据库 也可用于单独备份数据库所有表的索引 写mongo shell的js脚本 ...

  8. MySQL的索引优化分析(一)

    一.SQL分析 性能下降.SQL慢.执行时间长.等待时间长 查询语句写的差 索引失效关联查询太多join(设计缺陷) 单值索引:在user表中给name属性创建索引,create index idx_ ...

  9. 获取html中某些标签的值

    一.获取单选按钮radio的值 <!doctype html> <html lang="en"> <head> <meta charset ...

  10. SEO大杀器rendertron安装

    前段时间做SEO的优化,使用的是GoogleChrome/rendertron,发现这个安装部署的时候还是会有一些要注意的地方,做个记录 为什么要使用rendertron 目前很多网站都是使用 vue ...