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
オブジェクトリテラルを考えることができることを知っているのに十分にスマートであるようにすることができますたとえ実際にを使用してDuck
のインスタンスを作成していない場合でも、Duck
となります。これは、duck
の構造がと互換性があり、タイプの型で十分であるため、構造に一致するためです。構造は単一のquack
メソッドのみである。
duck
をDuck
と入力すると、quack
メソッドがないと、コンパイルエラーが発生します。あなたの例と言われていること
let duck: Duck = { // compile error
mooo:() => {}
};
let duck: Duck = {
quack:() => {} // OK
}
は、HeroSerivce
は、idで英雄を得るために、すべての英雄を得るために1、および1つの二つの方法があります。 HeroService
class HeroComponent {
constructor(heroService: HeroService) {}
}
を受け取るコンストラクタを持つ
class HeroService {
getHeroes(): Hero[] { .. }
getHeroById(id: number): Hero { .. }
}
そしてHeroComponent
我々はHeroComponent
コンストラクタに次の
let mockService = { getHeroes:() => expectedHeroes }
に合格しようと今、私たちは、コンパイルエラーになりますmockService
が構造に一致しないため、のHeroService
。構造体が実際にの2つのメソッド、getHeroes
およびgetHero
で構成されている場合、1つのgetHeroes
メソッドしかありません。
コンパイラにそれを受け入れるように強制するには、<HeroService>
にキャストします。
構造体と一致するため、次のように渡すことができます(キャストなし)。
let mockService = {
getHeroes:() => expectedHeroes,
getHero: (id: number) => null
};
- 活字体のドキュメントの章Type Compatibility
からの続きを読みます