Class 类型脚本子类类型(类型断言)

Class 类型脚本子类类型(类型断言),class,inheritance,types,typescript,subclass,Class,Inheritance,Types,Typescript,Subclass,我希望你喜欢动物。下面是一个发言的例子: class Animal { constructor(public name: string, public age: number) {} } class Cat extends Animal { constructor(name: string, age: number) { super(name, age); } public miaou() { console.log('Miaou'); } } class

我希望你喜欢动物。下面是一个发言的例子:

class Animal {
  constructor(public name: string, public age: number) {}
}

class Cat extends Animal {
  constructor(name: string, age: number) {
    super(name, age);
  }
  public miaou() {
    console.log('Miaou');
  }
}

class Kennel {
  animals = Map<string, Animal> new Map();

  public addAnimal(animal: Animal): void {
    this.animals.set(animal.name, animal);
  }

  public retrieveAnimal(name: string): Animal {
    return this.animals.get(name);
  }
}

let kennel = <Kennel> new Kennel();
let hubert = <Cat> new Cat('Hubert', 4);

kennel.addAnimal(hubert);

let retrievedCat: Cat = kennel.retrieveAnimal('Hubert'); // error  
let retrievedCat = <Cat> kennel.retrieveAnimal('Hubert'); // Works
类动物{
构造函数(公共名称:string,公共年龄:number){}
}
猫科动物{
构造函数(名称:字符串,年龄:数字){
超级(姓名、年龄);
}
公共庙(){
console.log('Miaou');
}
}
等级犬舍{
动物=映射新映射();
公共添加动物(动物:动物):无效{
this.animals.set(animal.name,animal);
}
公共检索动物(名称:字符串):动物{
返回此。动物。获取(名称);
}
}
让犬舍=新犬舍();
设休伯特=新猫('休伯特',4);
爱德动物犬(休伯特);
let retrievedCat:Cat=kennel.retrieveAnimal('Hubert');//错误
let retrievedCat=犬舍。retrieveAnimal('Hubert');//作品
错误:类型“Animal”不可分配给类型“Cat”。类型“Animal”中缺少属性“Miaou”

有人能给我解释一下区别吗?我以为没有

编辑: 好的,在typescript规范中有详细说明:

类形状{…}
类圆扩展形状{…}
函数createShape(种类:字符串):形状{
如果(种类==“圆圈”)返回新的圆圈();
...
}
var circle=createShape(“圆”)函数“retrieveAnimal”返回一个“Animal”类型的对象,但在这里

let retrievedCat: Cat = kennel.retrieveAnimal('Hubert');
您声明了“Cat”类型的“retrievedCat”变量,所以确实不能将动物强制转换为Cat

在第二种情况下:

let retrievedCat = <Cat> kennel.retrieveAnimal('Hubert');
let retrievedCat=kennel.retrieveAnimal('Hubert');

您可以声明“any”类型的“retrievedCat”变量(您不指定任何类型,所以默认情况下为“any”),并将值指定为“Cat”。显然,你可以把“猫”换成“任何”,伊姆霍。

好的!但是如何使用这些不同类型的声明呢?为什么不只使用第二个声明?因此,我们可以使用retrievedAnimal=。。。谢谢视情况而定。如果您绝对是舒尔的对象类型,您可以选择“任意”类型(变体2)。如果不是,您可以使用“instanceof”操作符()检查类型。