静态成员

# 静态成员

面向对象中可能会存在一个问题就是。

我如何去判断一个对象是否具有某种能力

/**
 * 动物园中有动物:狮子、老虎、猴子、狗
 * 他们存在的技能
 * 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()
})

// 使用 is 指定对应的接口告诉他是什么类型。
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();
    }
})