接口
# 接口
/**
* 动物园中有动物:狮子、老虎、猴子、狗
* 他们存在的技能
* 1.钻火圈
* 2.走钢丝
* 3.接飞盘
*/
interface FireCycle {
singleFire(): boolean,
doubleFire(): void
}
interface Balance {
walkRow(): void
}
interface Speed {
flyPan(): void
}
abstract class Animal {
abstract type: string;
name: string;
age: number;
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello(): void {
console.log(`大家好我的名字是${this.name},今年${this.age},我是${this.type}`);
}
}
class Lion extends Animal implements FireCycle {
type: string = 'Lion-狮子';
singleFire() {
console.log('钻一个火圈');
return true
}
doubleFire() {
console.log('钻两个火圈');
}
}
class Tiger extends Animal implements FireCycle {
singleFire(): boolean {
console.log('钻一个火圈');
return false;
}
doubleFire(): void {
console.log('钻两个火圈');
}
type: string = "Tiger-老虎";
}
class Monkey extends Animal implements Balance {
walkRow(): void {
console.log('走钢丝');
}
type: string = "Monkey-猴子";
}
class Dog extends Animal implements Speed {
flyPan(): void {
console.log("接飞盘");
}
type: string = "Dog-狗子";
}
let l = new Lion('JSON', 1);
let t = new Tiger('Tom', 1);
let mm = new Monkey('Alisa', 1);
let d = new Dog('john', 1);
const animals = [l, t, mm, d];
animals.forEach(item => {
item.sayHello()
})
function hasFireShow(ani: object): ani is FireCycle {
if ((ani as unknown as FireCycle).singleFire && (ani as unknown as FireCycle).doubleFire) {
return true
}
return false
}
animals.forEach(item => {
// 说明拥有跳火圈的能力
if (hasFireShow(item)) {
item.singleFire();
}
})