首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录子类类型(类型断言)

类型记录子类类型(类型断言)
EN

Stack Overflow用户
提问于 2015-10-17 18:06:06
回答 1查看 1.6K关注 0票数 0

希望你喜欢动物。下面是一个具体的例子:

代码语言:javascript
复制
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

错误:不能将“动物”类型指定为键入“猫”。属性“Miaou”在“动物”类型中缺失。

有人能解释我的区别吗?我以为没有..。

编辑:确定,它在打字稿规范:类型断言中有详细说明。

代码语言:javascript
复制
class Shape { ... }
class Circle extends Shape { ... }
function createShape(kind: string): Shape {
 if (kind === "circle") return new Circle();
 ...
}
var circle = <Circle> createShape("circle");

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-17 18:26:21

"retrieveAnimal“函数返回一个”动物“类型的对象,但在这里

代码语言:javascript
复制
let retrievedCat: Cat = kennel.retrieveAnimal('Hubert');

您声明"retrievedCat“变量的”猫“类型,所以您确实不能把动物给猫。

在第二种情况下:

代码语言:javascript
复制
let retrievedCat = <Cat> kennel.retrieveAnimal('Hubert');

您可以声明" any“类型的"retrievedCat”变量(您没有指定任何类型,因此默认情况下为- "any"),并将值指定为"Cat“。显然,你可以把“猫”转换成“任何”,IMHO。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33189886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档