TypeScript 是 Javascript 的一个超集,提升了代码的可读性和可维护性。Typescript 官网提供的 文档已经至关完善,但完整地看一遍须要必定的时间,本文试将 TypeScript 中要点提出,缩略为一文,用于浏览要点、快速复习。
boolean/number/string/null/undefined
html
其中 null/undefined
是 TypeScript 中任何类型的子类型。node
void/any/enum/never
git
void
指空值,若用于变量,则该变量只能赋值为 null/undefined;若用于函数,则该函数返回值为 空/null/undefined。github
any
指任意值。TypeScript 中变量赋值后类型是没法改变的,但 any
类型的变量能够改变为任意值。(声明变量且没法类型推论时默认为 any
类型)typescript
enum
指枚举类型,取值能够枚举出来。npm
enum Color {Red, Green, Blue} let c: Color = Color.Green;
never
指不存在的值的类型,例如异常,函数无限循环没法返回等。json
TypeScript 中数组类型有多种定义方式,罗列以下:数组
1.类型 + 方括号ide
let list: number[] = [1, 2, 3];
2.数组泛型 Array<元素类型>
函数
let list: Array<number> = [1, 2, 3];
3.元组 Tuple
表示一个已知元素数量和类型的数组
let x: [string, number] = ['1', 2]
4.接口定义类型
interface NumberArray { [index: number]: number; } let x: NumberArray = [1, 1, 2, 3, 5];
TypeScript 中函数类型有多种定义方式,罗列以下:
1.函数声明中类型定义
function add(x: number, y: number): number { return x + y; }
2.函数表达式中类型定义
let myAdd = function(x: number, y: number): number { return x + y; }
3.箭头函数中类型定义
let myAdd = (x: number, y: number): number => { return x + y; }
4.接口定义类型
interface Add { (x: number, y: number): number; } let myAdd: Add = function(num1, num2) { return num1 + num2; }
TypeScript 中对象类型有多种定义方式,罗列以下:
1.object
let obj: object = {test: 1};
2.接口定义类型
interface SquareConfig { color: string; width: number; } let newSquare: SquareConfig = { color: "white", width: 100 };
联合类型表示值为多种类型中的一种,用 |
进行类型联合
泛型指在定义函数、接口、类时,不预先指定类型,在使用时再指定。泛型经过在函数、接口、类变量名后使用 <>
定义。(类型断言中 <>
位于变量名前)
function identity<T>(arg: T): T { return arg; } identity<string>('myString')
在没有指定类型时,Typescript 会根据类型推论推断出类型。
// 推论类型为 number let x = 1; // 推论类型为 any let y;
类型断言指对变量指定一个比如今类型更明确的类型。
类型断言有两种形式。
1."尖括号"语法:
// 声明 someValue let someValue: any = "this is a string"; // 对 someValue 类型断言,类型为 string,比原先 any 类型更明确 let strLength: number = (<string>someValue).length;
2."as" 语法(在 tsx 中只能使用 as 语法,由于 jsx 中 <>
会和"尖括号"语法混淆)
let someValue: any = "this is a string"; let strLength: number = (someValue as string).length;
类型别名不会新建类型,是经过新建名字来引用已有类型。经过 type
进行别名定义。
type Name = string; let x: Name = '1';
类的概念是 ES6 中提出的,类的本质是构造函数的语法糖,经过 class
来建立。
TypeScript 中提供了 public
、private
和 protected
三种修饰符,分别表明属性或方法是共有的、私有的、受保护的。
TypeScript 中 static
修饰符修饰属性或方法,表明属性或方法是静态的,即无需实例化,能够直接经过类调用。
TypeScript 中 readonly
修饰符修饰属性,表明属性只读,即初始化以后不可修改。
抽象类指对类或类中部分方法进行抽象,做为其余类继承的基类,不能直接实例化。派生类必须实现抽象类中的抽象方法。
经过 abstract
关键字定义抽象类和抽象类内部定义的抽象方法,extends
来继承类。
abstract class Animal { // 必须在派生类中实现 abstract makeSound(): void; // 无须在派生类中实现 move(): void { console.log('roaming the earch...'); } } class Dog extends Animal { makeSound (): void { console.log('barking'); } }
接口和抽象类有些相似,接口是对属性和方法的抽象,不能直接实例化。接口和抽象类的区别以下:
接口经过 interface
定义,implements
实现。
interface ClockInterface { alert(): void; } class Clock implements ClockInterface { alert() { console.log('Clock alert'); } }
TypeScript 根据 JavaScript 提供了相关的内置对象,如 Date、Document、HTMLElement、Event、NodeList 等。具体可参考定义文件。
以 npm 包为例,将第三方包安装到 TypeScript 项目时,须要声明文件,声明该第三方包中导出内容的相关类型,这样 TypeScript 才能进行编译检查。声明文件以 .d.ts
结尾的文件,有如下3个来源:
1.@types
TypeScript 2.0 默认查看 ./node_modules/@types
文件夹,获取模块的类型定义。例如能够经过安装 npm install --save-dev @types/node
获取 node 类型相关声明。该开源项目 DefinitelyTyped 目前由社区进行维护。
2.第三方包已有声明文件
第三方包已有声明文件,则不须要再额外安装包,能够直接使用。一般经过 package.json
中的 types
字段,或者 index.d.ts
声明文件进行声明。
3.书写声明文件
当前面两种方法都无效时,能够在项目中书写声明文件,如建立 types
目录,用来管理声明文件。声明文件写法能够参考 DefinitelyTyped 中相关示例,以下为其中一个示例:
// 声明 createABigTriangle 方法 declare function createABigTriangle(gl: WebGLRenderingContext): void; // 第三方库是 commonjs 规范的,导出声明使用 export= 这种语法 // 第三方库是 ES6 规范的,导出声明使用 export default 和 export 这种语法 export = createABigTriangle;
本文首发于我的博客:https://www.aquatalking.com/b...
(完)