基础

布尔值

  let isDone: boolean = false;

数值

  let decLiteral: number = 6;

字符串

  let myName: string = 'tom';

无值

1.示例

  let myName: null = null;
let myName: undefined = undefined;

2.null/undefined是所有类型的子类型

  let val: 其它类型 = undefined;

空值

1.关键字为void,只能被赋值undefined和null

  let unusable: void = undefined;

任意值

1.可以赋值为任意类型的值(没有类型限制)

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

2.对任意值进行任何操作,返回值类型都是任意值

3.变量声明时,如果未指定类型

  a.未赋值,则会默认为any类型
let something;
something = 'seven';
something = 7;
b.赋值了,则会被类型推断为所赋值的类型
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7; // 会报错

联合

1.表示取值可以为多种类型中的一种

2.示例

  let myFavoriteNumber: string | number
myFavoriteNumber = 'seven'
myFavoriteNumber = 7

3.当不确定联合类型变量的类型时,只能访问此联合类型的所有类型里共有的属性或方法

  function getString(something: string | number): string {
return something.toString()
}

对象

1.对象的类型由接口定义

2.接口是对行为的抽象,而具体实现则由类去实现

3.示例代码

  interface Person {
name: string
age: number
} let tom: Person = {
name: 'Tom',
age: 25
}

4.对象定义时,变量的属性数量/形状必须和接口属性数量/形状保持一致

5.可选属性

	interface Person {
name: string
age?: number
} let tom: Person = {
name: 'Tom'
}

5.可索引属性(数字索引的返回值必须是字符串索引返回值类型的子类型)

	interface Person {
name: string
age: number
[propName: string]: string
}
// 报错

6.只读属性

	interface Person {
readonly id: number
age: number
} let tom: Person = {
id: 10,
age: 25
} tom.id = 89757 // 报错

数组

1.类型+方括号表示法

	let arr: number[] = [1, 1, 2, 3, 5];
let arr: number[] = [1, 1, 2, 3, '5']; // 会报错
arr.push('5'); // 会报错

2.数组泛型

	let fibonacci: Array<number> = [1, 1, 2, 3, 5]

3.接口表示数组

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

4.any数组

  • 用any表示数组中允许出现任意类型
  • 示例
	let list: any[] = ['xjh', 25, { key: 'xx' }]

5.类数组

  • a.常见的类数组都有自己的接口定义,如 IArguments, NodeList, HTMLCollection
  • b.示例
	function sum() {
let args: IArguments = arguments
}

函数

1.函数声明

  • 示例
	function sum(x: number, y: number): number {
return x + y;
}
  • 输入多余/少于要求的参数,是不被允许的
	sum(1, 2, 3) // 报错
sum(1) // 报错

2.函数表达式

  • 示例
	let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
return x + y
}
  • =>用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型

3.用接口定义函数的形状

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

4.可选参数

  • 可选参数,必须接在必需参数后面
  • 可选参数,后面不允许再出现必须参数

5.参数默认值

  • 同ES6
  • 会将添加了默认值的参数,识别为可选参数
  • 不受"可选参数必须接在必需参数后面"的限制

6.剩余参数

  • 同ES6

7.重载

  • 允许一个函数接受不同数量或类型的参数时,作出不同的处理
  • 示例
	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('');
}
}
  • 如果多个函数定义有包含关系,需要优先把精确的定义写在前面

进阶

类型推断

定义

  • 如果没有明确指定类型,那么ts会依照类型推论规则推断出一个类型

代码示例

	let myFavoriteNumber = 'seven';
myFavoriteNumber = 7; // 报错,因为已推断为字符串

强调

  • 如果定义的时候没有赋值,会被推断成any类型
	let myFavoriteNumber;
myFavoriteNumber = 'seven';
myFavoriteNumber = 7;

类型断言

1.手动指定一个值的类型,然后才可以使用类型对应的方法,否则只能访问公共属性/方法

	function getLength(something: string | number): number {
if ((<string>something).length) {
return (<string>something).length;
} else {
return something.toString().length;
}
}

2.方法

  • <类型>值
  • 值 as 类型

3.断言成一个联合类型中不存在的类型是不允许的

	function toBoolean(something: string | number): boolean {
return <boolean>something
}

类型别名

定义

  • 用来给一个类型起个新名字

示例代码

	type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;

字符串字面量类型

定义

  • 用来约束取值只能是某几个字符串中的一个

示例代码

	type EventNames = 'click' | 'scroll' | 'mousemove';
function handleEvent(ele: Element, event: EventNames) {}

注意

  • 类型别名与字符串字面量类型都是使用type进行定义

元祖Tuple

定义

  • 数组合并了相同类型的对象,而元组合并了不同类型的对象

示例

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

注意

1.当赋值或访问一个已知索引的元素时,可以只赋值其中一项

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

2.直接对元祖类型赋值时,需提供所有类型项

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

3.当添加越界元素时,类型会被限制为定义项的类型

	let tom: [string, number];
tom = ['Tom', 25];
tom.push('male');
tom.push(true); // 报错

枚举

定义

  • 用于取值被限定在一定范围内的场景

简单示例

	enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 0); // true
console.log(Days[0] === "Sun"); // true

手动赋值

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

	console.log(Days["Sun"] === 7); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Sat"] === 6); // true

说明

  • 未手动赋值的枚举项会接着上一个枚举项递增
  • 未手动赋值的枚举项与手动赋值的重复了,ts不会察觉,后者只会覆盖前者

枚举项类型

1.常数项和计算所得项

2.计算所得项·示例

	enum Color { Red, Green, Blue = "blue".length };

3.如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错

	enum Color { Red = "red".length, Green, Blue }; // 报错

常数枚举

1.示例代码

	const enum Directions {
Up,
Down,
Left,
Right
} let directions = [ Directions.Up, Directions.Down, Directions.Left, Directions.Right ]; var directions = [0, 1, 2, 3]; //编译结果

2.常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员

外部枚举

1.示例代码

	declare enum Directions {
Up,
Down,
Left,
Right
} let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; var directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; //编译结果

2.declare 定义的类型只会用于编译时的检查,编译结果中会被删除

3.外部枚举与声明语句一样,常出现在声明文件中

概言

  • TS除了实现了所有ES6中的类的功能以外,还添加了一些新的用法

修饰符

	public       	可被公开访问
private 仅供自身访问,子类也不可以访问它的属性/方法
protected 受保护的访问,子类可以访问它的属性/方法

抽象类

  • 用abstract关键字定义(抽象类/抽象方法)
  • 不允许被实例化
  • 抽象方法必须被子类实现
  • 抽象类可以包含成员的实现细节

类与接口

类实现接口

  • 把各层级的类之间共有的特性提取出来进行实现的部分叫接口
  • 接口通过interface定义,通过implements实现
  • 一个类只能继承一个类,但是可以实现多个接口
  • 接口不会帮你检查类是否具有某些私有成员
  • 接口只会对类的实例部分进行类型检查

接口继承接口

  • 通过extends关键字来继承

接口继承类

  • 通过extends关键字来继承
  • 接口继承了拥有私有或受保护成员的类时,这个接口只能被这个类或其子类所实现

泛型

定义

  • 在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性

  • 示例代码

	function createArray<T>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value;
}
return result;
}
createArray<string>(3, 'x'); // ['x', 'x', 'x']

多个类型参数

	function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]];
}
swap([7, 'seven']); // ['seven', 7]

泛型默认类型

	function createArray<T = string>(length: number, value: T): Array<T> {
let result: T[] = [];
for (let i = 0; i < length; i++) {
result[i] = value
}
return result;
}

泛型约束

1.由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法

	function loggingIdentity<T>(arg: T): T {
console.log(arg.length); // 报错
return arg;
}

2.对泛型进行约束

	interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}

3.泛型之间也可以相互约束

function copyFields<T extends U, U>(target: T, source: U): T {
for (let id in source) {
target[id] = (<T>source)[id];
}
return target;
} let x = { a: 1, b: 2, c: 3, d: 4 }; copyFields(x, { b: 10, d: 20 });

4.在泛型约束中使用类型参数

function getProperty<T, K extends keyof T> (obj: T, key: K ) {
return obj[key]
} let x = {a: 1, b: 2, c: 3, d: 4} getProperty(x, 'a') // okay
getProperty(x, 'm') // error

泛型接口

	写法一
interface A {
<T>(arg: T): T;
}
function fn<T>(arg: T): T {
return arg;
}
let test: A = fn;
test<number>(1); // 手动指定-在调用时 传递 泛型参数类型
test(1); // 类型推断-在调用时 推断 泛型参数类型
写法二
interface A<T> {
(arg: T): T;
}
function fn<T>(arg: T): T {
return arg;
}
let test: A<number> = fn; // 接口定义了需要传递类型参数T,这里为number
test<number>(1) // 报错,因为类型定义A<number>已经指定
test('1'); // 报错,必须符合接口A<number>参数类型

泛型类

	class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}

声明文件

概要

1.使用第三方库时,需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能

2.声明语句中只能定义类型,切勿在声明语句中定义具体的实现

3.示例代码

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

4.注意

  • 带有声明语句的文件即为声明文件
  • 声明文件必需以 .d.ts为后缀
  • 如果ts无法解析声明文件,检查tsconfig.json中的files、include和exclude配置,确保其包含了对应库的xx.d.ts文件

5.第三方声明文件

  • 通常使用@types统一管理第三方库的声明文件
  • 示例
	npm install @types/jquery --save-dev

声明合并

1.如果定义了两个相同名字的函数、接口或类,那么它们会合并成一个类型

2.合并的属性类型必须是唯一的

3.函数合并

  • 参考函数重载示例

4.接口合并

	interface Alarm {
price: number;
} interface Alarm {
weight: number;
} // 等同于
interface Alarm {
price: number;
weight: number;
}

5.类合并

  • 与接口的合并规则一致

书写声明文件

1.声明合并

  • 一个东西既可以是函数,也可以是对象(拥有子属性)
  • 示例
	declare function jQuery(selector: string): any
declare namespace jQuery {
function ajax(url: string, settings?: any): void
}

2.export

  • 声明文件中禁止定义具体的实现
  • interface前是不需要declare的

3.export default

  • 只有 function、class 和interface可以直接默认导出,其他变量需先声明,再默认导出
  • 一般会将导出语句放在整个声明文件的最前面

4.commonjs规范下的export

  • commonjs导出
	module.exports = foo; 	// 整体导出
exports.bar = bar; // 单个导出
  • 在导入方式上,有两种跟es6语法相同
  • 官推导入方式(commonjs下)
	import foo = require('foo');   	// 整体导入
import bar = foo.bar; // 单个导入
  • 官推导出方式(commonjs下)(假如要为它写类型声明文件的话)
	export = foo
declare function foo(): string
  • 两种官推方式都是ts为了兼容AMD和commonjs规范而创立的

5.UMD库的导出

	export as namespace '导出名'

6.在npm包/UMD库中扩展全局变量

	declare global {
interface String {
prependHello(): string
}
}

7.模块插件(declare module)

	// index.d.ts声明
import * as moment from 'moment'; declare module 'moment' {
export function foo(): moment.CalendarKey
} // index.ts使用
import * as moment from 'moment';
import 'moment-plugin'; moment.foo();

8.声明文件中的依赖

  • 示例参考<模块插件index.d.ts声明>
  • 三斜杠指令
    • 早期版本中为了描述模块之间的依赖关系而创造的语法
    • 使用场景:书写一个全局变量,并且需要依赖一个全局变量声明文件时
    • 示例
	/// <reference types="jquery" />

	declare function foo(options: JQuery.AjaxSettings): string
  • 三斜线指令必须放在文件的最顶端,它前面只允许出现单行或多行注释
  • 拆分声明文件

    • 示例
	/// <reference types="sizzle" />
/// <reference path="JQueryStatic.d.ts" />
/// <reference path="JQuery.d.ts" />
/// <reference path="misc.d.ts" />
/// <reference path="legacy.d.ts" /> export = jQuery;
  • types用于声明对另一个库的依赖,path用于声明对另一个文件的依赖

9.自动生成声明文件

  • 命令行

    • 在命令行中添加--declaration(简写-d)
  • 配置文件
    • 在tsconfig.json中添加declaration选项
    • 示例代码
	{
"compilerOptions": {
"module": "commonjs",
"outDir": "lib",
"declaration": true
}
}

发布声明文件

1.将声明文件和源码放在一起(ts声明查找也遵循a=>b=>c)

  • package.json中配置types或typings字段,指定声明文件
  • 在项目根目录下,放置一个index.d.ts声明文件
  • 针对package.json的入口文件位置,放置一个声明文件

2.将声明文件发布到@types下

  • 与普通的npm模块不同,@types统一由DefinitelyTyped管理

内置对象的声明文件

  • TypeScript核心库定义中,包含了所有游览器环境用到的类型(ECMAScript,DOM和BOM标准)
  • TypeScript核心库定义中,不包含Nodejs部分(需要npm install @types/node --save-dev)

《TypeScript入门教程》笔记的更多相关文章

  1. HTML+CSS笔记 CSS笔记集合

    HTML+CSS笔记 表格,超链接,图片,表单 涉及内容:表格,超链接,图片,表单 HTML+CSS笔记 CSS入门 涉及内容:简介,优势,语法说明,代码注释,CSS样式位置,不同样式优先级,选择器, ...

  2. CSS笔记--选择器

    CSS笔记--选择器 mate的使用 <meta charset="UTF-8"> <title>Document</title> <me ...

  3. HTML+CSS笔记 CSS中级 一些小技巧

    水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...

  4. HTML+CSS笔记 CSS中级 颜色&长度值

    颜色值 在网页中的颜色设置是非常重要,有字体颜色(color).背景颜色(background-color).边框颜色(border)等,设置颜色的方法也有很多种: 1.英文命令颜色 语法: p{co ...

  5. HTML+CSS笔记 CSS中级 缩写入门

    盒子模型代码简写 回忆盒模型时外边距(margin).内边距(padding)和边框(border)设置上下左右四个方向的边距是按照顺时针方向设置的:上右下左. 语法: margin:10px 15p ...

  6. HTML+CSS笔记 CSS进阶再续

    CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...

  7. HTML+CSS笔记 CSS进阶续集

    元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1&g ...

  8. HTML+CSS笔记 CSS进阶

    文字排版 字体 我们可以使用css样式为网页中的文字设置字体.字号.颜色等样式属性. 语法: body{font-family:"宋体";} 这里注意不要设置不常用的字体,因为如果 ...

  9. HTML+CSS笔记 CSS入门续集

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代(标签). 语法: p{color:red;} <p> ...

  10. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

随机推荐

  1. [phyton]文件的简单读写练习

    f.open() 用于打开一个文件. f=open("record.txt","w",encoding="utf-8")#打开文件,设置文件 ...

  2. Spring boot 梳理 - 在bean中使用命令行参数-自动装配ApplicationArguments

    If you need to access the application arguments that were passed to SpringApplication.run(…​), you c ...

  3. 配置eclipse编写html/js/css/jsp/java时自动提示

    配置eclipse编写html/js/css/jsp/java时自动提示步骤: 1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修 ...

  4. How to setup Electrum testnet mode and get BTC test coins

    For some reason we need to use BTC test coins, but how to set up the Bitcoin testnet wallet and get ...

  5. 编写shell脚本实现一键创建KVM虚拟机

    shell脚本一键创建虚拟机 代码如下: #!/bin/bashname=$1 #把位置变量$1重新定义为name(创建虚拟机的名字)path1=/var/lib/libvirt/images/ #i ...

  6. Shell之Glob和RE的区别

    目录 Shell之Glob和RE的区别 参考 Glob RE Shell之Glob和RE的区别

  7. locate,find

    locate:非实时查找,模糊匹配,查找是根据全系统文件数据库进行的,可以使用updatedb命令来手动生成数据库 find:实时查找,精确匹配,支持众多查找标准,遍历指定目录中的所有文件完成查找,速 ...

  8. Windows Error的错误代码

    时不时会用到,记录下 0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存储空间不足,无法处 ...

  9. Python3 GUI开发(PyQt)安装和配置

    Python3 GUI开发(PyQt5)安装和配置: 下载安装好Miniconda3, 并且安装好jupyter 注意:最好关闭360杀毒软件或者把cmd加入信任,否则运行activate会有问题. ...

  10. Eclipse的debug按钮介绍(三)

    本文链接:https://blog.csdn.net/u011781521/article/details/55000066    http://blog.csdn.net/u010075335/ar ...