- TypeScript 基础
- TypeScript - 首页
- TypeScript - 路线图
- TypeScript - 概述
- TypeScript - 环境设置
- TypeScript - 基本语法
- TypeScript vs. JavaScript
- TypeScript - 特性
- TypeScript - 变量
- TypeScript - let & const
- TypeScript - 运算符
- TypeScript 基本类型
- TypeScript - 类型
- TypeScript - 类型注解
- TypeScript - 类型推断
- TypeScript - 数字
- TypeScript - 字符串
- TypeScript - 布尔值
- TypeScript - 数组
- TypeScript - 元组
- TypeScript - 枚举
- TypeScript - any
- TypeScript - never
- TypeScript - 联合类型
- TypeScript - 字面量类型
- TypeScript - 符号
- TypeScript - null vs. undefined
- TypeScript - 类型别名
- TypeScript 控制流
- TypeScript - 决策
- TypeScript - if 语句
- TypeScript - if else 语句
- TypeScript - 嵌套 if 语句
- TypeScript - switch 语句
- TypeScript - 循环
- TypeScript - for 循环
- TypeScript - while 循环
- TypeScript - do while 循环
- TypeScript 函数
- TypeScript - 函数
- TypeScript - 函数类型
- TypeScript - 可选参数
- TypeScript - 默认参数
- TypeScript - 匿名函数
- TypeScript - 函数构造器
- TypeScript - rest 参数
- TypeScript - 参数解构
- TypeScript - 箭头函数
- TypeScript 接口
- TypeScript - 接口
- TypeScript - 扩展接口
- TypeScript 类和对象
- TypeScript - 类
- TypeScript - 对象
- TypeScript - 访问修饰符
- TypeScript - 只读属性
- TypeScript - 继承
- TypeScript - 静态方法和属性
- TypeScript - 抽象类
- TypeScript - 存取器
- TypeScript - 鸭子类型
- TypeScript 高级类型
- TypeScript - 交叉类型
- TypeScript - 类型守卫
- TypeScript - 类型断言
- TypeScript 类型操作
- TypeScript - 从类型创建类型
- TypeScript - Keyof 类型操作符
- TypeScript - Typeof 类型操作符
- TypeScript - 索引访问类型
- TypeScript - 条件类型
- TypeScript - 映射类型
- TypeScript - 模板字面量类型
- TypeScript 泛型
- TypeScript - 泛型
- TypeScript - 泛型约束
- TypeScript - 泛型接口
- TypeScript - 泛型类
- TypeScript 其他
- TypeScript - 三斜杠指令
- TypeScript - 命名空间
- TypeScript - 模块
- TypeScript - 环境声明
- TypeScript - 装饰器
- TypeScript - 类型兼容性
- TypeScript - 日期对象
- TypeScript - 迭代器和生成器
- TypeScript - Mixins
- TypeScript - 实用程序类型
- TypeScript - 装箱和拆箱
- TypeScript - tsconfig.json
- 从 JavaScript 到 TypeScript
- TypeScript 有用资源
- TypeScript - 快速指南
- TypeScript - 有用资源
- TypeScript - 讨论
TypeScript - 类
TypeScript 是面向对象的 JavaScript。TypeScript 支持面向对象的编程特性,例如类、接口等。在面向对象编程中,类是创建对象的蓝图。类封装了对象的数据。TypeScript 为此概念提供了内置支持,称为类。JavaScript ES5 或更早版本不支持类。TypeScript 从 ES6 获取此特性。
创建类
使用 class 关键字在 TypeScript 中声明一个类。语法如下:
语法
class class_name { //class scope }
class 关键字后跟类名。命名类时必须考虑标识符的规则。
类定义可以包含以下内容:
字段 - 字段是在类中声明的任何变量。字段表示与对象相关的数据
构造函数 - 负责为类的对象分配内存
函数 - 函数表示对象可以执行的操作。它们有时也称为方法
这些组件组合在一起被称为类的成员。
考虑 TypeScript 中的 Person 类。
class Person { }
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var Person = (function () { function Person() { } return Person; }());
示例:声明一个类
class Car { //field engine:string; //constructor constructor(engine:string) { this.engine = engine } //function disp():void { console.log("Engine is : "+this.engine) } }
此示例声明了一个名为 Car 的类。该类有一个名为 engine 的字段。声明字段时不使用 var 关键字。上面的示例为类声明了一个构造函数。
构造函数是类的特殊函数,负责初始化类的变量。TypeScript 使用 constructor 关键字定义构造函数。构造函数是一个函数,因此可以参数化。
this 关键字指的是类的当前实例。这里,参数名和类字段名相同。因此,为了避免歧义,类字段前缀为 this 关键字。
disp() 是一个简单的函数定义。请注意,这里没有使用 function 关键字。
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var Car = (function () { //constructor function Car(engine) { this.engine = engine; } //function Car.prototype.disp = function () { console.log("Engine is : " + this.engine); }; return Car; }());
创建实例对象
要创建类的实例,请使用 new 关键字后跟类名。语法如下:
语法
var object_name = new class_name([ arguments ])
new 关键字负责实例化。
表达式的右侧调用构造函数。如果构造函数是参数化的,则应向其传递值。
示例:实例化一个类
var obj = new Car("Engine 1")
访问属性和函数
可以通过对象访问类的属性和函数。使用“.”点表示法(称为句点)来访问类的成员。
//accessing an attribute obj.field_name //accessing a function obj.function_name()
示例:将它们组合在一起
class Car { //field engine:string; //constructor constructor(engine:string) { this.engine = engine } //function disp():void { console.log("Function displays Engine is : "+this.engine) } } //create an object var obj = new Car("XXSY1") //access the field console.log("Reading attribute value Engine as : "+obj.engine) //access the function obj.disp()
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var Car = (function () { //constructor function Car(engine) { this.engine = engine; } //function Car.prototype.disp = function () { console.log("Function displays Engine is : " + this.engine); }; return Car; }()); //create an object var obj = new Car("XXSY1"); //access the field console.log("Reading attribute value Engine as : " + obj.engine); //access the function obj.disp();
上述代码的输出如下:
Reading attribute value Engine as : XXSY1 Function displays Engine is : XXSY1
类继承
TypeScript 支持继承的概念。继承是程序从现有类创建新类的一种能力。扩展以创建新类的类称为父类/超类。新创建的类称为子类/子类。
类使用 extends 关键字继承自另一个类。子类继承所有属性和方法,但私有成员和构造函数除外。
语法
class child_class_name extends parent_class_name
但是,TypeScript 不支持多重继承。
示例:类继承
class Shape { Area:number constructor(a:number) { this.Area = a } } class Circle extends Shape { disp():void { console.log("Area of the circle: "+this.Area) } } var obj = new Circle(223); obj.disp()
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var Shape = (function () { function Shape(a) { this.Area = a; } return Shape; }()); var Circle = (function (_super) { __extends(Circle, _super); function Circle() { _super.apply(this, arguments); } Circle.prototype.disp = function () { console.log("Area of the circle: " + this.Area); }; return Circle; }(Shape)); var obj = new Circle(223); obj.disp();
上述代码的输出如下:
Area of the Circle: 223
上面的示例声明了一个 Shape 类。该类被 Circle 类扩展。由于类之间存在继承关系,子类,即 Car 类,可以隐式访问其父类的属性,即 area。
继承可以分类为:
单继承 - 每个类最多可以从一个父类继承
多继承 - 一个类可以从多个类继承。TypeScript 不支持多重继承。
多层继承 - 下面的示例显示了多层继承的工作方式。
示例
class Root { str:string; } class Child extends Root {} class Leaf extends Child {} //indirectly inherits from Root by virtue of inheritance var obj = new Leaf(); obj.str ="hello" console.log(obj.str)
Leaf 类通过多层继承从 Root 和 Child 类派生属性。
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var Root = (function () { function Root() { } return Root; }()); var Child = (function (_super) { __extends(Child, _super); function Child() { _super.apply(this, arguments); } return Child; }(Root)); var Leaf = (function (_super) { __extends(Leaf, _super); function Leaf() { _super.apply(this, arguments); } return Leaf; }(Child)); var obj = new Leaf(); obj.str = "hello"; console.log(obj.str);
其输出如下:
输出
hello
TypeScript ─ 类继承和方法重写
方法重写是一种机制,子类通过它来重新定义超类的方法。下面的示例说明了这一点:
class PrinterClass { doPrint():void { console.log("doPrint() from Parent called…") } } class StringPrinter extends PrinterClass { doPrint():void { super.doPrint() console.log("doPrint() is printing a string…") } } var obj = new StringPrinter() obj.doPrint()
super 关键字用于引用类的直接父类。该关键字可以用来引用变量、属性或方法的超类版本。第 13 行调用 doWork() 函数的超类版本。
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var PrinterClass = (function () { function PrinterClass() { } PrinterClass.prototype.doPrint = function () { console.log("doPrint() from Parent called…"); }; return PrinterClass; }()); var StringPrinter = (function (_super) { __extends(StringPrinter, _super); function StringPrinter() { _super.apply(this, arguments); } StringPrinter.prototype.doPrint = function () { _super.prototype.doPrint.call(this); console.log("doPrint() is printing a string…"); }; return StringPrinter; }(PrinterClass)); var obj = new StringPrinter(); obj.doPrint();
上述代码的输出如下:
doPrint() from Parent called… doPrint() is printing a string…
static 关键字
static 关键字可以应用于类的成员。静态变量保留其值,直到程序执行结束。静态成员由类名引用。
示例
class StaticMem { static num:number; static disp():void { console.log("The value of num is"+ StaticMem.num) } } StaticMem.num = 12 // initialize the static variable StaticMem.disp() // invoke the static method
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var StaticMem = (function () { function StaticMem() { } StaticMem.disp = function () { console.log("The value of num is" + StaticMem.num); }; return StaticMem; }()); StaticMem.num = 12; // initialize the static variable StaticMem.disp(); // invoke the static method
上述代码的输出如下:
The value of num is 12
instanceof 运算符
instanceof 运算符如果对象属于指定的类型,则返回 true。
示例
class Person{ } var obj = new Person() var isPerson = obj instanceof Person; console.log(" obj is an instance of Person " + isPerson);
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var Person = (function () { function Person() { } return Person; }()); var obj = new Person(); var isPerson = obj instanceof Person; console.log(" obj is an instance of Person " + isPerson);
上述代码的输出如下:
obj is an instance of Person True
数据隐藏
类可以控制其数据成员对其他类成员的可见性。此功能称为数据隐藏或封装。
面向对象使用访问修饰符或访问说明符的概念来实现封装的概念。访问说明符/修饰符定义类的数据成员在其定义类之外的可见性。
TypeScript 支持的访问修饰符为:
序号 | 访问说明符 & 描述 |
---|---|
1. | public public 数据成员具有普遍的可访问性。类中的数据成员默认是 public 的。 |
2. | private 私有数据成员只能被定义这些成员的类访问。如果外部类成员试图访问私有成员,编译器会抛出错误。 |
3. | protected 受保护的数据成员可被同一类中的成员以及子类的成员访问。 |
示例
让我们来看一个例子,看看数据隐藏是如何工作的:
class Encapsulate { str:string = "hello" private str2:string = "world" } var obj = new Encapsulate() console.log(obj.str) //accessible console.log(obj.str2) //compilation Error as str2 is private
该类有两个字符串属性 str1 和 str2,它们分别是公共成员和私有成员。该类被实例化。该示例返回编译时错误,因为私有属性 str2 在声明它的类之外被访问。
类和接口
类也可以实现接口。
interface ILoan { interest:number } class AgriLoan implements ILoan { interest:number rebate:number constructor(interest:number,rebate:number) { this.interest = interest this.rebate = rebate } } var obj = new AgriLoan(10,1) console.log("Interest is : "+obj.interest+" Rebate is : "+obj.rebate )
AgriLoan 类实现了 Loan 接口。因此,它现在绑定到该类,将其属性 interest 作为其成员。
编译后,它将生成以下 JavaScript 代码。
//Generated by typescript 1.8.10 var AgriLoan = (function () { function AgriLoan(interest, rebate) { this.interest = interest; this.rebate = rebate; } return AgriLoan; }()); var obj = new AgriLoan(10, 1); console.log("Interest is : " + obj.interest + " Rebate is : " + obj.rebate);
上述代码的输出如下:
Interest is : 10 Rebate is : 1