2015-10-17 2 views
0

Надеюсь, вы любите животных. Вот пример выступления:Тип подзаголовка подписи (Тип утверждений)

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 

Ошибка: Тип «Animal» не может быть присвоен типу «Cat». Свойство «Miaou» отсутствует в типе «Animal».

Кто-нибудь может объяснить мне разницу? Я думал, что не было ни одного ...

EDIT: ОК, он подробно описан в спецификации Машинопись: Type Assertions

class Shape { ... } 
 
class Circle extends Shape { ... } 
 
function createShape(kind: string): Shape { 
 
if (kind === "circle") return new Circle(); 
 
... 
 
} 
 
var circle = <Circle> createShape("circle");

ответ

0

Функция "retrieveAnimal" возвращает объект типа «животных», но здесь

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

вы объявляете переменную «retrievedCat» типа «Cat», поэтому вы действительно не можете отличить Animal to Cat.

Во втором случае:

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

вы объявляете «retrievedCat» переменный «любого» типа (вы не определяете типа, поэтому по умолчанию - «любой»), а также указать значение, как "Кот". Очевидно, вы можете бросить «Cat» на «any», IMHO.

+0

ok! Но как использовать эти разные декларации? Почему бы не использовать только объявление seconde? Поэтому мы могли бы использовать retrievedAnimal = ... Спасибо! – Tiramitsu

+0

Всё зависит от меня. Если вы абсолютно уверены в типе объекта, вы можете использовать «любой» тип (вариант 2). Если нет, вы можете проверить тип с помощью оператора «instanceof» (http://stackoverflow.com/questions/12789231/class-type-check-with-typescript). – TSV

Смежные вопросы