面向对象也便是OOP(Object Oriented Programming),是计算机的一种编程架构,OOP的基本原则是计算机是由子程序做用的单个或者多个对象组合而成,包含属性和方法的对象是类的实例,面向对象的基本特性是:封装、继承、多态、抽象。程序员
一直到今天对于JavaScript是不是面向对象的语言定论仍然没有一致的结果,由于JavaScript(ES5)中没有类的概念,而是直接使用对象来实现编程,使用原型来实现继承,一种基于对象和事件驱动的弱类型动态语言。因为这些不一而足的缺点,微软推出了JavaScript的超集语言--TypeScript;TypeScript
就是一个基于类的面向对象编程语言。编程
在早期的软件开发中,开发者一般使用过程式的程序语言编写代码。在过程式的语言中,程序遵循自顶向下的原则开发,而且逻辑都包裹在函数中。当程序员意识到过程式的语言没法提供他们须要的抽象层次、可维护性和复用性时,出现了OOP,并总结了5个OOP开发者须要遵照的原则,以便更容易地建立出可维护和可拓展的系统。bash
咱们用类去描述一个对象或者实例,一个类由名字、属性、方法组成。架构
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
在传统的面向对象的编程中,一个类能够扩展另外一个类,也能够实现一个或多个接口;实现一个接口能够被看做是签署了一份协议,必须遵照它的规则。接口的规则是属性和方法的签名,咱们必须实现它们;框架
在TypeScript中接口有两点不一样:编程语言
interface UserInterface {
name: string;
password: string;
}
var user: UserInterface = {
name: '',
password: '' // 容易遗漏错误性
}
复制代码
面向对象编程最重要的特性之一就是能够扩展已有的类,它容许咱们建立一个类(子类),从已有的类(父类)上继承全部的属性和方法,子类能够包含父类中没有的属性和方法;函数
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();
复制代码
如同范型函数同样,范型类可以帮助咱们避免重复代码,有时候咱们可能会须要约束范型类,一个可行的解决方案是在范型类或函数内使用typeof操做符来验证参数范型的类型;this
interface MyInterface {
doSomething();
}
interface MySecondInterface {
doSomethingElse();
}
class Example<T extends MyInterface, MySecondInterface> {
private genericProperty: T;
useT() {
this.genericProperty.doSomething();
this.genericProperty.doSomethingElse(); // 编译错误
}
}
复制代码
TypeScript提供了命名空间特性,主要用于组织代码,若是在写一个大型应用,这时能够用命名空间包裹那些有联系的接口、类和对象,并使代码更加容易跟踪和理解。
namespace app {
export class UserModel {
// ...
}
}
复制代码
当声明一个命名空间时,全部实体部分默认都是私有的,可使用export关键字导出公共部分,也能够在命名空间内声明另外一个命名空间;
namespace app {
export namescpace models {
export class UserModel {
// ...
}
}
}
复制代码
以上就是TypeScript的一些面向对象编程的概念,TypeScript的好处很明显,在编译时就能检查出不少语法问题而不是在运行时。目前国内使用Typescript的团队并很少,我以为写出的代码是否易于维护、优雅,不在于用了什么框架、语言,而在于开发者自己,可是不能保证每一个人都不犯错,诚然好的框架和语言能间接帮助开发者写出规范的代码,因此若是有必定技术沉淀的团队仍是建议早点使用TypeScript
。
更多精彩内容欢迎关注个人我的公众号【天道酬勤Lewis】