乐趣区

关于ecmascript-6:TypeScript之类

根底阐明

先来看个例子:

class Person {
    name: string;
    constructor(name: string) {this.name = name;}
    say() {return "你好,我是" + this.name;}
}

这样,咱们就定义了一个类,蕴含一个属性用于保留名称,一个结构器用于创立的时候设置名称,办法 say 用于获取名称形容:

let person = new Person("小强");
console.log(person.say());

打印的后果就是:“你好,我是小强”。

公共,公有与受爱护的修饰符

也就是定义属性、办法等的拜访权限,上面来具体阐明。

public

默认拜访权限就是 public,你能够自在的拜访程序里定义的成员,比方下面的例子和上面的代码是等价的:

class Person {
    public name: string;
    public constructor(name: string) {this.name = name;}
    public say() {return "你好,我是" + this.name;}
}

private

当成员被标记成 private 时,它就不能在申明它的类的内部拜访,比方咱们对下面的例子进行革新:

class Person {
    private name: string;
    constructor(name: string) {this.name = name;}
    say() {return "你好,我是" + this.name;}
}

var person = new Person('小明');

能够看见,name 当初是公有属性了,那么上面代码仍旧是能够的:

person.say();

而上面的代码就不行:

// Property 'name' is private and only accessible within class 'Person'.
person.name;

舒适提醒:两个类如果所有的成员的类型都是兼容的,咱们就认为它们的类型是兼容的,可是,比拟带有 private 或 protected 成员类型的时候,不只是类型须要雷同,并且还须要来自同一份申明。

protected

和 private 相似,惟一不同的是,除了能够在申明它的类的外部拜访,还能够在派生类中拜访:

class Person {
    protected name: string;
    constructor(name: string) {this.name = name;}
}
    
class ChinaPerson extends Person {constructor(name: string) {super(name);
    }
    say() {return "你好,我是" + this.name + ",我来自中国";}
}

let chinaPerson = new ChinaPerson("小茜");

那么,上面代码也是可行的:

chinaPerson.say();

readonly 修饰符

也就是标记只读,只读的属性只能申明时或构造函数里被初始化,例如:

class Person {readonly name: string = "小灰灰";}
    
let person = new Person();

那么,读取是能够的:

person.name;

而上面当咱们尝试批改就会出错:

// Cannot assign to 'name' because it is a read-only property.
person.name = "大灰灰";

参数属性

如果只读属性心愿通过构造函数初始化,能够这样:

class Person {
    readonly name: string;
    constructor(name: string) {this.name = name;}
}

而更简略的写法是:

class Person {constructor(readonly name: string) {this.name = name;}
}

动态属性

也就是那些归属类而不是对象的属性或办法,例如:

class Person {static age: number;}

间接应用类即可拜访:

Person.age = 10;

而对象则无法访问:

// Property 'age' does not exist on type 'Person'. 
// Did you mean to access the static member 'Person.age' instead?ts(2576)
new Person().age = 10;

存取器

比方咱们当初有一个场景:

class Person {name: string;}

那么,咱们创立好对象后就能够很容易的设置和获取属性 name 值:

let person = new Person();

person.name = "阿肥";
console.log(person.name);

可是当初有一个问题,name 值在设置的时候必须满足肯定规定。怎么办?咱们就能够把下面的类改写成应用 getter 和 setter 来实现:

class Person {
    private _name: string;
    
    get name(): string {return this._name;}
    
    set name(name: string) {if (name.length > 4) {this._name = name;}
    }
}

名称设置名称的时候,长度必须大于 4,不然会设置失败。

继承

比方狗是动物,那么狗就能够继承动物下面的一些内容:

class Animal {eat() {console.log("我会吃饭");
    }
}
    
class Dog extends Animal {bark() {console.log("我会狗叫");
    }
}

动物的实例上就有 eat 办法,而狗除了 eat 还能够 bark。

抽象类

和接口相似,只不过能够蕴含成员的实现细节,abstract 关键字是用于定义抽象类和在抽象类外部定义形象办法:

abstract class Dog {abstract bark(): void;
    run(): void {console.log("我在跑");
    }
}
退出移动版