TypeScript的类,简单地定义如下:

class Person {
x: number; // 默认为public类型
y: number;
constructor(x1: number, y1: number) { // 默认为public类型
this.x = x1;
this.y = y1;
}
} let test = new Person(12, 34)

ts中,定义一个类使用class关键字,使用new进行类的实例化,constructor关键字用来定义该类的构造函数。

参数属性

什么叫做参数属性,比如上面的x、y字段的声明和构造实例化是分两步进行的,可以归纳到如下一步:

class Person {
constructor(public x1: number, public y1: number) {} // 注意这里的实现
} let test = new Person(12, 34)

继承

使用extends关键字可以实现类之间的继承,包括字段、方法的继承,看个例子:

class Person {
constructor(public x1: number, public y1: number) { }
greet() {
return this.x1 + '-' + this.y1;
}
} class A extends Person {
constructor(x: number, y: number) {
super(x, y);
// ...
}
greet2() {
return this.greet()
}
} let test = new A(12, 23);
console.log('extends from Person: ', test.greet()); // extends from Person: 12-23
console.log('self method: ', test.greet2()); // self method: 12-23
注意:
派生类包含了一个构造函数,它必须调用 super(),它会执行基类的构造函数。而且,在构造函数里访问 this的属性之前,我们一定要调用 super()。 这个是TypeScript强制执行的一条重要规则。
当然,调用super之后在A类中你可以像Person类中那样进行后续处理。

public修饰符

public修饰符可以表示字段或者方法是共有的,也就是说在子类和其它类是可访问的,如下:

class Animal {
public name: string;
public constructor(theName: string) { this.name = theName; }
public move(distanceInMeters: number) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
} let animal = new Animal('rabbit 兔子');
animal.move(1); // rabbit 兔子 moved 1m.
animal.name = '狗熊,忘了英文咋写了';
animal.move(200); // 狗熊,忘了英文咋写了 moved 200m.

private修饰符

private修饰符可以表示字段或者方法是私有的,也就是只在当前类中有效,出了该类是无法访问的,举个栗子:

class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
} class Rhino extends Animal {
constructor(public age: number) { super("Rhino"); }
} let test = new Animal('狗娃');
// test.name // wrong!访问不到,因为name私有 let test2 = new Rhino(23);
test2.age // 23

protected修饰符

用protected修饰的字段只能在当前类及其子类中访问,被protected修饰的构造函数,构造函数所在的类不能直接直接进行new操作,但是该构造可以被子类继承,从而子类进行重新构造,但是还要首先调用super。

class Person {
protected name: string;
protected constructor(theName: string) { this.name = theName; }
} // Employee 能够继承 Person
class Employee extends Person {
private department: string; constructor(name: string, department: string) {
super(name);
this.department = department;
} public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
} let howard = new Employee("Howard", "Sales");
// let john = new Person("John"); // 错误: 'Person' 的构造函数是被保护的.可以被继承,不能直接new

readonly修饰符

被readonly修饰的字段是只读的,该地段必须要么在声明时初始化,要么在构造里面初始化。

class Octopus {
readonly name: string;
readonly numberOfLegs: number = 8;
constructor (theName: string) {
this.name = theName;
}
}
let dad = new Octopus("Man with the 8 strong legs");
dad.name = "Man with the 3-piece suit"; // 错误! name 是只读的.

get和set存取器

对于private字段,一般我们会在class中使用存取器进行赋值及调用,这就是get和set的作用。

class Person {
private _name: string;
set name(theName: string) {
console.log('-----------')
this._name = theName;
}
get name(): string {
return this._name + '********';
}
} let test = new Person();
test.name = 'admin'
console.log(test.name)

输出如下:

-----------
admin********
注意:
get存取器必须要有返回值,没有返回值可以写void返回,返回不确定可以使用any类型。

静态属性

静态属性定义时,直接在属性或字段前面加上static修饰即可。

class Grid {
static origin = { x: 0, y: 0 };
static test;
constructor (public scale: number) { }
calculateDistanceFromOrigin(point: { x: number; y: number; }) {
let xDist = (point.x - Grid.origin.x);
let yDist = (point.y - Grid.origin.y);
return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;
}
testValue() {
console.log('testing: ', Grid.test);
}
} let grid1 = new Grid(1.0); // 1x scale
let grid2 = new Grid(5.0); // 5x scale console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10})); // 14.142135623730951
console.log(grid2.calculateDistanceFromOrigin({ x: 10, y: 10 })); // 2.8284271247461903
console.log(grid1.testValue()); // testing: undefined
注意:
static字段调用的时候直接使用:类名.字段名 调用,实例字段使用:(new Class).字段名 调用,当然class内部直接使用this调用。

抽象类

使用abstract关键字修饰一个抽象类,和接口不同的是,抽象类中可以有成员的实现细节,举个栗子:

abstract class Department {

    constructor(public name: string) {
} printName(): void {
console.log('Department name: ' + this.name);
} abstract printMeeting(): void; // 必须在派生类中实现
} class AccountingDepartment extends Department { constructor() {
super('Accounting and Auditing'); // 在派生类的构造函数中必须调用 super()
} printMeeting(): void {
console.log('The Accounting Department meets each Monday at 10am.');
} generateReports(): void {
console.log('Generating accounting reports...');
}
} let department: Department; // 允许创建一个对抽象类型的引用
// department = new Department(); // 错误: 不能创建一个抽象类的实例
department = new AccountingDepartment(); // 允许对一个抽象子类进行实例化和赋值
department.printName();
department.printMeeting();
// department.generateReports(); // 错误: 方法在声明的抽象类中不存在 let accountingDepartment: AccountingDepartment;
accountingDepartment = new AccountingDepartment();
accountingDepartment.generateReports();
注意:
1、abstract的class不能直接被new,只能被extends
2、abstract的method必须被子类实现

TypeScript学习笔记之类的更多相关文章

  1. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  8. TypeScript学习笔记(八):1.5版本之后的模块和命名空间

    我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...

  9. typescript学习笔记(三)---接口

    关于第二章的学习笔记是变量声明. 接口:TypeScript的核心原则之一是对值所具有的结构进行类型检查. 它有时被称做“鸭式辨型法”或“结构性子类型化”. 在TypeScript里,接口的作用就是为 ...

  10. typescript学习笔记(一)---基础变量类型

    作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...

随机推荐

  1. java输出各种学生成绩

    class stu { public String stuno; public String name; public float math; public float english; public ...

  2. tornado的非异步阻塞模式

    [优化tornado阻塞任务的三个选择] 1.优化阻塞的任务,使其执行时间更快.经常由于是一个DB的慢查询,或者复杂的上层模板导致的,这个时候首要的是加速这些任务,而不是优化复杂的webserver. ...

  3. 【Java入门提高篇】Day2 接口

    上一篇讲完了抽象类,这一篇主要讲解比抽象类更加抽象的内容--接口. 什么是接口呢?先来看个栗子: /** * @author Frank * @create 2017/11/22 * @descrip ...

  4. Redis安装及使用笔记

    windows下安装Redis 1.下载Redis的软件包 Redis on github; 2.将软件解压到服务器软件目录; 3.在命令行运行此命令: ./redis-server redis.wi ...

  5. keras 修仙笔记一

    对于牛逼的程序员,人家都喜欢叫他大神:因为大神很牛逼,人家需要一个小时完成的技术问题,他就20分钟就搞定.Keras框架是一个高度集成的框架,学好它,就犹如掌握一个法宝,可以呼风唤雨.所以学keras ...

  6. Maven3 快速入门

    Maven3 快速入门 Maven 是目前大型项目构建的必备知识.本章会通过介绍 Maven 的作用,Maven 的基本语法,以及搭建企业级项目架构来快速入门 Maven .前两部分是理论知识只需要了 ...

  7. SQL SERVER 2012 SEQUENCE

    一.Sequence简介 Sequence对象对于Oracle用户来说是最熟悉不过的数据库对象了, 在SQL SERVER2012终于也可以看到这个对象了.Sequence是SQL Server201 ...

  8. SQL Server 结构分解

    关系引擎和存储引擎是SQL Server 的两大组件,其中关系引擎也叫查询处理器,它包括查询优化器.命令解析器.查询执行器.存储引擎管理所有的数据及涉及的IO,它包括事务管理器和数据访问方法和缓冲区管 ...

  9. 六、Hadoop学习笔记————调优之操作系统以及JVM

    内核参数overcommit_memory  它是 内存分配策略 可选值:0.1.2.0, 表示内核将检查是否有足够的可用内存供应用进程使用:如果有足够的可用内存,内存申请允许:否则,内存申请失败,并 ...

  10. input type="radio" 赋值问题

    之前项目中 后台传值 然后赋给单选input   在网上找了好久,现在有时间了,整理一下  ,方便以后有人会用到. $('radio[name="sex"][value'" ...