Чтобы добавить к JB Nizet's answer и дать небольшое объяснение причин, лежащих в основе кода.
машинопись использует Structural Type System. Это означает, что если он ошеломляет как утку, то ее можно считать утиной (точнее, быть совместимой с с утиной). Возьмем, к примеру
class Duck {
quack() { }
}
let duck = {
quack:() => {}
}
С duck
имеет метод quack
, вы можете передать его к чему-либо, ожидающей Duck
, как
function doQuack(duck: Duck) {
duck.quack();
}
doQuack(duck);
машинопись достаточно умен, чтобы знать, что duck
литерал объекта можно считать a Duck
, даже если мы никогда не создадим экземпляр Duck
с использованием duck = new Duck()
. Это связано с тем, что структуры duck
достаточно, чтобы быть совместимым с типом Duck
, так как он соответствует структуре; причем структура представляет собой только один метод quack
.
Если бы мы попытались ввести duck
как Duck
, и у нас не было метода quack
, тогда мы получили бы ошибку компиляции.
let duck: Duck = { // compile error
mooo:() => {}
};
let duck: Duck = {
quack:() => {} // OK
}
Это, как говорится, с, например, HeroSerivce
имеет два метода, один, чтобы получить все герой, и один, чтобы получить герой по идентификатору.
class HeroService {
getHeroes(): Hero[] { .. }
getHeroById(id: number): Hero { .. }
}
И HeroComponent
с конструктором, который принимает HeroService
class HeroComponent {
constructor(heroService: HeroService) {}
}
Теперь, если мы попытаемся пройти следующие
let mockService = { getHeroes:() => expectedHeroes }
к HeroComponent
конструктора, мы получим ошибку компиляции потому что mockService
не соответствует структуре of HeroService
. Он имеет только один метод getHeroes
, когда структура фактически состоит из двух методов, getHeroes
и getHero
.
Поэтому, чтобы заставить компилятор просто принять его, мы «отбросим» его на <HeroService>
.
Мы могли бы передать следующее (без «литья»), и оно будет работать, потому что оно соответствует структуре.
let mockService = {
getHeroes:() => expectedHeroes,
getHero: (id: number) => null
};
- Подробнее из машинопись документации главы Type Compatibility