Надеюсь, вы любите животных. Вот пример выступления:Тип подзаголовка подписи (Тип утверждений)
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");
ok! Но как использовать эти разные декларации? Почему бы не использовать только объявление seconde? Поэтому мы могли бы использовать retrievedAnimal = ... Спасибо! –
Tiramitsu
Всё зависит от меня. Если вы абсолютно уверены в типе объекта, вы можете использовать «любой» тип (вариант 2). Если нет, вы можете проверить тип с помощью оператора «instanceof» (http://stackoverflow.com/questions/12789231/class-type-check-with-typescript). – TSV