TypeScript学习笔记,三:类

在TypeScript中,类似于C#的结构,即一个文件中可以存在多个类,且文件名可以任意取,我们先看一个简单的类的示例。

 1 class Person {
 2     private name: string;
 3     private age: number;
 4 
 5     public constructor(name:string, age:number) {
 6         this.name = name;
 7         this.age = age;
 8     }
 9 
10     public talk() {
11         alert("Hi, my name is " + this.name + ", i am " + this.age.toString() + "!");
12     }
13 }
14 
15 function run() {
16     var p: Person = new Person("Li Lei", 18);
17     p.talk();
18 }
19 
20 run();

TypeScript中的类需要注意下面几个点:

  • class前不用加访问控制符,所有类都是全局公开可访问的;
  • 如果类的属性和方法不加访问控制符则默认为public;
  • 1.3开始支持protected访问权限,1.3之前仅支持public及private;
  • 构造函数不是类名而是constructor;
  • 访问类的成员变量及函数都需要加this关键字;

类的继承

在TypeScript中,如何实现类的继承呢,请看如下示例:

 1 class Person
 2 {
 3     private name: string;
 4     private age: number;
 5 
 6     constructor(name: string, age: number)
 7     {
 8         this.name = name;
 9         this.age = age;
10     }
11 
12     talk()
13     {
14         alert("Hi, my name is " + this.name + ", i am " + this.age.toString() + "!");
15     }
16 }
17 
18 class Student extends Person
19 {
20     private school: string;
21 
22     constructor(name: string, age: number, school: string)
23     {
24         super(name, age);
25         this.school = school;
26     }
27 
28     talk()
29     {
30         super.talk();
31         alert("And I`m in " + this.school + "!");
32     }
33 }
34 
35 function run()
36 {
37     var p: Person = new Student("Li Lei", 18, "English School");
38     p.talk();
39 }
40 
41 run();

类的继承需要注意以下几点:

  • 继承使用extends关键字;
  • 调用父级使用super关键字;
  • 重写父级方法不需要加override关键字,直接定义一样的方法即可;
  • 父级变量可以调用到子级的方法,符合多态的概念;

getter/setter封装

在TypeScript中我们可以对一个成员变量进行getter和setter的封装,如下:

 1 class Person
 2 {
 3     private _name:string;
 4 
 5     constructor(name: string)
 6     {
 7         this._name = name;
 8     }
 9 
10     set name(value:string) {this._name = value;}
11     get name() {return this._name;}
12 
13     talk()
14     {
15         alert("Hi, my name is " + this.name + "!");
16     }
17 }
18 
19 function run()
20 {
21     var p:Person = new Person(null);
22     p.name = "Li Lie";
23     p.talk();
24 }
25 
26 run();

静态数据和方法

在TypeScript中,是可以使用Static来定义静态变量及静态函数的,我们以单例类为例来看看:

 1 class Person
 2 {
 3     private static _instance:Person;
 4 
 5     static getInstance():Person
 6     {
 7         if(this._instance == null)
 8         {
 9             this._instance = new Person();
10         }
11         return this._instance;
12     }
13 
14     talk()
15     {
16         alert("Hi, my name is Li Lie!");
17     }
18 }
19 
20 function run()
21 {
22     Person.getInstance().talk();
23 }
24 
25 run();

reference

TypeScript允许多个类在同一个文件里,但如果类与类在不同的文件,需要这种写法:

1 /// <reference path="SimpleWebSocket.ts"/>
2 class ComplexWebSocket extends SimpleWebSocket {
3 ...
4 }