TypeScript中的面向对象编程

面向对象也便是OOP(Object Oriented Programming),是计算机的一种编程架构,OOP的基本原则是计算机是由子程序做用的单个或者多个对象组合而成,包含属性和方法的对象是类的实例,面向对象的基本特性是:封装、继承、多态、抽象。程序员

一直到今天对于JavaScript是不是面向对象的语言定论仍然没有一致的结果,由于JavaScript(ES5)中没有类的概念,而是直接使用对象来实现编程,使用原型来实现继承,一种基于对象和事件驱动的弱类型动态语言。因为这些不一而足的缺点,微软推出了JavaScript的超集语言--TypeScriptTypeScript就是一个基于类的面向对象编程语言编程

1. SOLID原则

在早期的软件开发中,开发者一般使用过程式的程序语言编写代码。在过程式的语言中,程序遵循自顶向下的原则开发,而且逻辑都包裹在函数中。当程序员意识到过程式的语言没法提供他们须要的抽象层次、可维护性和复用性时,出现了OOP,并总结了5个OOP开发者须要遵照的原则,以便更容易地建立出可维护和可拓展的系统。bash

  • 单一职责原则(SRP):代表软件组件(函数、类、模块)必须专一与单一的任务(只有单一的职责);
  • 开/闭原则(OCP):代表软件设计时必须考虑到代码的扩展性,程序的发展必须最少地修改已有的代码(对已有的修改封闭);
  • 里氏替换原则(LSP):代表只要继承的是同一个接口,程序里任意一个类均可以被其余对象(应该能够是在不改变程序正确性的前提下被它的子类)所替换;
  • 接口隔离原则(ISP):代表应该将很是大的接口拆分红一些小的更具体的接口,多个特定客户端接口要好于一个宽泛用途的接口;
  • 依赖反转原则(DIP):代表一个方法应该听从依赖于抽象借口而不是一个实例(类的概念);

2. 类

咱们用类去描述一个对象或者实例,一个类由名字、属性、方法组成。架构

class Person {
  public name: string;
  public surname: string;
  public email: Email;
  constructor(name: string, surname: string, email: Email) {
    this.name = name;
    this.surname = surname;
    this.email = email;
  }
  greet() {
    console.log(`Hi, ${this.name}`);
  }
}

var me : Person = new Person('lewis', 'lewislv', 'lewis@163.com');
复制代码

一个类要遵循单一职责原则(SRP),可让咱们更容易的看出它的做用,进而去扩展它,这样就用到类的封装和抽象的概念;app

3. 接口

在传统的面向对象的编程中,一个类能够扩展另外一个类,也能够实现一个或多个接口;实现一个接口能够被看做是签署了一份协议,必须遵照它的规则。接口的规则是属性和方法的签名,咱们必须实现它们;框架

在TypeScript中接口有两点不一样:编程语言

  • 接口能够扩展其余接口或者类;
  • 接口能够定义数据和行为而不仅是行为;
interface UserInterface {
    name: string;
    password: string;
}

var user: UserInterface = {
    name: '',
    password: ''  // 容易遗漏错误性
}
复制代码

4. 继承

面向对象编程最重要的特性之一就是能够扩展已有的类,它容许咱们建立一个类(子类),从已有的类(父类)上继承全部的属性和方法,子类能够包含父类中没有的属性和方法;函数

class Teacher extends Person {
    teach() {
        console.log('Welcome to class!');
    }
}

var teacher = new Teacher('lewis', 'lewislv', 'lewis@163.com');
teacher.teach();
teacher.greet();
复制代码

有时咱们但愿子类能提供父类中同名方法的特殊实现,能够用保留字super达到这个目的。ui

class Teacher extends Person {
    public subjects: string [];
    constructor(name: string, surname: string, email: Email) {
        super(name, surname, email);
        this.subjects = subjects;
    }
    greet() {
        super.greet();
        console.log(`I teach ${this.subjects!}`);
    }
}

var teacher = new Teacher('lewis', 'lewislv', 'lewis@163.com');
teacher.teach();
teacher.greet();
复制代码

5. 范型类和范型约束

如同范型函数同样,范型类可以帮助咱们避免重复代码,有时候咱们可能会须要约束范型类,一个可行的解决方案是在范型类或函数内使用typeof操做符来验证参数范型的类型;this

interface MyInterface {
    doSomething();
}
interface MySecondInterface {
    doSomethingElse();
}

class Example<T extends MyInterface, MySecondInterface> {
    private genericProperty: T;
    useT() {
        this.genericProperty.doSomething();
        this.genericProperty.doSomethingElse(); // 编译错误
    }
}
复制代码

6. 命名空间

TypeScript提供了命名空间特性,主要用于组织代码,若是在写一个大型应用,这时能够用命名空间包裹那些有联系的接口、类和对象,并使代码更加容易跟踪和理解。

namespace app {
    export class UserModel {
        // ...
    }
}
复制代码

当声明一个命名空间时,全部实体部分默认都是私有的,可使用export关键字导出公共部分,也能够在命名空间内声明另外一个命名空间;

namespace app {
    export namescpace models {
        export class UserModel {
            // ...
        }
    }
}
复制代码

总结

以上就是TypeScript的一些面向对象编程的概念,TypeScript的好处很明显,在编译时就能检查出不少语法问题而不是在运行时。目前国内使用Typescript的团队并很少,我以为写出的代码是否易于维护、优雅,不在于用了什么框架、语言,而在于开发者自己,可是不能保证每一个人都不犯错,诚然好的框架和语言能间接帮助开发者写出规范的代码,因此若是有必定技术沉淀的团队仍是建议早点使用TypeScript

更多精彩内容欢迎关注个人我的公众号【天道酬勤Lewis】

相关文章
相关标签/搜索