总目录

从C#到TypeScript - 类

在ES6之前Javascript的类都是用function定义的,ES6把类关键字正式加进来,虽说其实也还是function,不过代码可读性上好了不少。

TypeScript同样支持class,并且和C#也非常相似,下面来看看:

同C#一样,由构造函数,属性,方法组成,属性和方法有三个级别的访问权限:private, protected, public,比C#少个internal

不过不同的是C#类的成员默认是private,而TypeScript默认是public

在类里面所有成员都必须用this来访问。

class User{
constructor(name: string, pwd: string){
this.name = name;
this.pwd = pwd;
} name: string;
private pwd: string; checkLogin(): boolean{
return this.name === 'brook' && this.pwd === '123';
}
} let u: User = new User('brook', '123');
console.info(u.checkLogin()); // true u.name = 'test';
console.info(u.checkLogin()); // false

参数属性

上面的User类有两个成员,而且都是从构造函数赋值的,也就是其实构造函数的参数就是类的成员,这就是参数属性。

类里面的那两个属性其实可以不用写,只要在构造函数的参数上加上操作限定符,TypeScript就会自动为参数生成属性,来重构下上面的User

class User{
constructor(public name: string, private pwd: string){ } checkLogin(): boolean{
return this.name === 'brook' && this.pwd === '123';
}
}

getter/setter

同样,也有存取器,不过语法和C#不太一样,写起来稍麻烦些。

只有get的时候也就变成只读属性了。

class User{
private _name: string; get name(): string{
return this._name;
} set name(name: string){
this._name = name;
}
}

静态属性和方法

上面说的都是实例成员,TypeScript也支持静态成员,不用实例化,而是通过类名来访问。

class User{
static permission = 'user'; static setPermission(p: string){
User.permission = p;
}
} console.info(User.permission); // user User.setPermission('admin');
console.info(User.permission); // admin

也同时支持staticreadonly,不过static要放在前面,这样可以实现单例模式。

class User{

    static readonly instance = new User();

    private constructor(){}

    checkLogin(name: string, pwd: string): boolean{
return name === 'brook' && pwd === '123';
}
} console.info(User.instance.checkLogin('brook', '123'));

抽象类

这点和C#一样,都可以用抽象类来把有共同行为抽象出来,关键字都是abstract

不能实例化,可以包含实现,abstract标识的方法,继承类必须实现。

但没有virtual关键字,不过和Java一样,可以认为是天生虚函数,也不需要override,直接覆盖也能支持多态。

继承类里要调用父类的函数需要用super关键字。

abstract class User{
name: string;
pwd: string; abstract checkLogin(): boolean; checkName(): boolean {
return this.name.indexOf('.') < 0;
}
} class Admin extends User {
checkLogin(): boolean { // 必须实现的抽象方法
return this.checkName();
} checkName(): boolean { // 这里会把User里的checkName覆盖掉
return true && super.checkName();
}
} let user: User;
user = new Admin();
user.name = 'brook.shi';
console.info(user.checkLogin()); // 同样有多态,checkLogin里调用的是Admin的checkName

另外,继承时还需要注意,如果派生类里有构造函数,则构造函数必须要调用父类的构造函数:super()

兼容性

TypeScript里的类是有兼容性的,这点和C#很不一样,TypeScript认为:只有成员的类型是兼容的,那它们的类型也是兼容的。

不过成员的兼容对于public很宽容,完全不相干的类如果全是public的成员,并且一致就认为是兼容的。

但对于privateprotected则只有是继承的才会被认可为兼容。

class Test1{
name: string;
pwd: string; checkName(): boolean{
return true;
}
} class Test2{
name: string;
pwd: string; checkName(): boolean{
return false;
}
} let t: Test1 = new Test2();
console.info(t.checkName()); // false

如果给上面的TestTest2各加一个private email: string;,结果是编译不了,因为它们并不是继承关系,也就兼容不了。

泛型

同接口一样支持泛型,用法也一样,可以参考接口泛型。

interface Testable<T> {
field: T;
method(arg: T): T;
} class Test<T> implements Testable<T>{
field: T;
method(arg: T): T{
console.info(`arg is ${typeof arg}`);
return null;
}
} let test11 = new Test<string>();
test11.method('method'); // arg is string
test11.method(123); // error, 123 is not string

总的来说,TypeScript的类和C#或Java可以说十分相似,除了兼容性基本上没有什么新的东西,不过对于JavaScript来说却是一大进步了。

从C#到TypeScript - 类的更多相关文章

  1. .NET手撸绘制TypeScript类图——上篇

    .NET手撸绘制TypeScript类图--上篇 近年来随着交互界面的精细化,TypeScript越来越流行,前端的设计也越来复杂,而类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式. ...

  2. .NET手撸绘制TypeScript类图——下篇

    .NET手撸绘制TypeScript类图--下篇 在上篇的文章中,我们介绍了如何使用.NET解析TypeScript,这篇将介绍如何使用代码将类图渲染出来. 注:以防有人错过了,上篇链接如下:http ...

  3. TypeScript:类(Classes)

    返回TypeScript手册总目录 传统的Javascript关注的是函数(function)和基于原型(prototype-based)的继承作为构建可重复使用组件的基本方式,但是与更舒服地使用面向 ...

  4. typescript类的修饰符

    学习过java的小姐姐,小哥哥应该很好理解,但还是啰嗦的写出来! typescript里面定义属性的时候给我们提供了 三种修饰符 public :公有 在当前类里面. 子类 .类外面都可以访问 pro ...

  5. typescript类(学习笔记非干货)

    我们声明一个 Greeter类.这个类有3个成员:一个叫做greeting的属性,一个构造函数和一个greet方法. We declare a Greeter class. This class ha ...

  6. typescript类与继承

    /* 1.vscode配置自动编译 1.第一步 tsc --inti 生成tsconfig.json 改 "outDir": "./js", 2.第二步 任务 ...

  7. typescript类 继承 修饰符

    //1.ts中类的定义 /* es5: function Person(name){ this.name=name; this.run=function(){ console.log(this.nam ...

  8. typescript 类(类的定义、继承、修饰符、抽象类)

    代码: // 本节内容 // 1.类的定义 // 2.类的继承 // 3.访问修饰符 // 4.静态属性和静态方法 // 5.抽象类和多态 // js // function Person(name) ...

  9. TypeScript入门四:TypeScript的类(class)

    TypeScript类的基本使用(修饰符) TypeScript类的抽象类(abstract) TypeScript类的高级技巧 一.TypeScript类的基本使用(修饰符) TypeScript的 ...

随机推荐

  1. [Unity Physics]Physics - Rigidbody、Collider

    什么是Collider 碰撞器组件在Unity引擎中触发物理碰撞的最基本的条件. 可以这样说,假如一个游戏中没有物理碰撞系统是不可能的. 什么是Rigidbody 通过物理模拟的控制对象的位置. Ri ...

  2. javascript基础教程学习总结(1)

    摘自javascript基础教程 开始: 1.将脚本放在哪里: 1.1 放在html和<html>之间 范例: <!DOCTYPE html PUBLIC "-//W3C/ ...

  3. RDA5820收音机芯片驱动

    RDA5820 是北京锐迪科推出的一款集成度非常高的立体声 FM收发芯片.该芯片具有以下 特点:   FM 发射和接收一体   支持 65Mhz~115Mhz的全球 FM接收频段,收发天线共用. ...

  4. SD卡初始化以及命令详解

    SD卡是嵌入式设备中很常用的一种存储设备,体积小,容量大,通讯简单,电路简单所以受到很多设备厂商的欢迎,主要用来记录设备运行过程中的各种信息,以及程序的各种配置信息,很是方便,有这样几点是需要知道的 ...

  5. Run Loop简介

    做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...

  6. eclipse控制台中文乱码解决

    Eclipse控制台中的中文输出乱码问题 博客分类: MySql EclipseTomcatXMLWeb  今天做S2SH集成的例子,所有该设置的地方都设置成了UTF-8,包括tomcat的配置文件s ...

  7. Tsinsen-A1489 抽奖 【数学期望】

    乔明达太神,其实已经题解非常清楚了,我再推一遍吧. 题目意思相当于有n个盒子,无差别投m次球,每个盒子的得分为每个盒子里的球的个数. 第一问: 假设这个球放在了第i个盒子里,那么 ∆ans = (mi ...

  8. IOS开发-UI学习-UITextField的各种属性设置

    UITextField是IOS中非常常用的一个控件,用来接收用户输入信息,完成应用和用户的交互.它的主要属性设置如下: //初始化textfield并设置位置及大小 UITextField *text ...

  9. 笔记-Python基础教程(第二版)第一章

    第一章 快速改造:基础知识 01:整除.乘方 (Python3.0之前 如2.7版本) >>> 1/2 ==>0 1/2整除,普通除法: 解决办法1: 1.0/2.0  ==& ...

  10. tomcat 修改端口(Java之负基础实战)

    1.找到server.xml tomcat 安装路径/config/server.xml 2.搜索8080 修改成想要的端口号 3.重启tomcat