深入的了解接口类
- 需求场景: 有一家马戏团 然后有四个 动物 1.老虎 2。马
- 2.他们有一些共同的东西 名字,年龄,打招呼
- 还有一些动物特有的技能 例如以下技能:
- 杂技: 跳火圈,
- 智慧表演: 算数
- 4.第二个需求是 动物打完招呼后 要进行技能 会杂技动物的进行表演
遇到的问题:
每个动物 能力没有强制类型约束 例如 狮子必须要会杂技表演 如果他没有写 我们使用老虎的时候调用那个杂技函数就会出现问题
下面是代码实现
// 接口
interface IAcrobatism { //杂技
fireCircle(): void
}
interface IWit {
count(): void
}
abstract class Zoo { //抽象父类
abstract animalName: string
abstract age: number;
sayHello() {
console.log(`大家好,我是${this.animalName},我的年龄是${this.age}`);
}
}
class Tiger extends Zoo implements IAcrobatism { // implements 就可以强制约束他必须有杂技表演 解决第一个问题的
fireCircle(): void {
console.log('跳火圈')
}
animalName: string = '老虎';
age: number = 10;
}
class Horse extends Zoo implements IWit {
count(): void {
console.log('算数表演')
}
animalName: string = '马'
age: number = 10
}
const zooList = [ //动物列表
new Tiger(),
new Horse()
]
zooList.forEach(it => {
it.sayHello() //打招呼 满足第一个需求
})
const typeGuard = (ain: Object): ain is IAcrobatism => {
if (ain as IAcrobatism) {
return true
}
return false
}
zooList.forEach(it => {
//需求是会打杂技的动物进行表演
//现在我们没办法知道谁会这个技能 如果我们去上面找那个动物会技能,如果这个动物突然不会这个技能了我们就要去重写这个代码所以不合理
//如果我们是js 就会这样判断 it?. fireCircle ==> true 的时候满足这个条件
// 可以使用类型保护函数
//这样写 如果这个动物没有了杂技表演 也不用重构这个函数里面的逻辑
if(typeGuard(it)){
it.fireCircle() //进行了杂技表演
}
})
总结
- 1.ts 可以强约束类 表达的该类必须剧本那些条件
- 2.可以进行函数类型保护
- 3.类型保护函数 必须要返回一个boolean 判断他是否符合这个