类跟接口非常相似
接口是低配版的类。
类是高配版的接口。
类就是用来创造对象的东西。
class Human {
name: string;
age: number;
constructor (name: string, age: number) {
this.name = name
this.age = age
}
say(): string {
return 'hi'
}
}
let simon:Human = new Human('simon', 18);
继承
class Animal {
birth: string;
constructor(public kind: string) {
if(kind === '哺乳动物'){
this.birth = '胎生'
} else {
this.birth = '卵生'
}
}
move():void {}
}
class Human extends Animal{
name: string;
age: number;
constructor (name: string, age: number) {
super('哺乳动物') // 对应父类的constructor 基类
this.name = name
this.age = age
}
say(): string {
this.move()
return 'hi'
}
}
let simon:Human = new Human('simon', 18);
公共,私有与受保护的修饰符
public 可以自由的访问程序里定义的成员; 默认就是public
private 当成员被标记成 private时,它就不能在声明它的类的外部访问。只能在自己的声明类内被使用
protected修饰符与 private修饰符的行为很相似,但有一点不同, protected成员在派生类中仍然可以访问。
class Animal {
protected birth: string; // 只能在基类和派生类中使用。
private Animalsecret: string;
constructor(public kind: string) {
this.Animalsecret = '1223'
if(kind === '哺乳动物'){
this.birth = '胎生'
} else {
this.birth = '卵生'
}
}
move():void {}
}
class Human extends Animal{
public name: string;
age: number;
private secret:string; // 只能在human类的作用域范围内使用
constructor (name: string, age: number) {
super('哺乳动物')
this.name = name
this.age = age
this.secret = '我的秘密'
}
say(): string {
this.move()
return `hi ${this.birth} ${this.Animalsecret}` // birth在此处可以调用, Animalsecret不能在这里调用,会报错
}
}
let simon:Human = new Human('simon', 18);
console.log(simon.secret) // 此处会报错
存取器
class Human{
name: string;
private _age: number; // 先设置为私有属性
get age() {
return this._age
}
set age(value) {
if (value <= 0) {
this._age = 0
} else {
this._age = value
}
}
constructor (name: string, age: number) {
this.name = name
this._age = age
}
say(): string {
return `hi`
}
}
let simon:Human = new Human('simon', 19)
simon.age = -1 // 调用set存。有些值我希望改的时候增加一些限制,不能随便乱改
console.log(simon.age) // 调用了get 返回 0
静态属性
类的属性,不是实例的属性
class Human{
static xxx =1;
name: string;
age: number;
constructor (name: string, age: number) {
this.name = name
this.age = age
}
say(): string {
return `hi`
}
}
let simon:Human = new Human('simon', 19)
console.log(Human.xxx) // 1
抽象类
也可以叫做「爸爸类」:专门当别的类的爸爸的类。
也可以叫做「没有写完的类」:只描述有什么方法,并没有完全实现这些方法。
由于这个类没有写完,所以不能创建出对象。(会报错)
abstract class Animal { // 抽象类 跟接口有些类似
abstract makeSound(): void; // 抽象方法,还没写完的方法。需要子类继续完善的方法
move(): void {
console.log('roaming the earch...');
}
}
let simon = new Animal() // 无法创建抽象类。抽象类还没有写完 会报错
class Human extends Animal {
constructor(public name:string, public age: number){
super()
}
makeSound(): void{ // 此处必须定义 makeSound。不然报错
console.log('hi')
}
}
readonly修饰符
你可以使用 readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化
class Human{
readonly name: string;
constructor (theName: string) {
this.name = theName;
}
}
let dad = new Human("simon");
dad.name = "jack"; // 错误! name 是只读的.