0

我正在学习Angular2。在 DI 页面中,有用于模拟的示例代码。 https://angular.io/docs/ts/latest/guide/dependency-injection.html

这是什么意思

let mockService = <HeroService> {getHeroes: () => expectedHeroes }

它看起来像mockService从函数定义HeroService函数。

是什么<HeroService>?是<HeroService>铸造吗?

let expectedHeroes = [{name: 'A'}, {name: 'B'}]
let mockService = <HeroService> {getHeroes: () => expectedHeroes }

it('should have heroes when HeroListComponent created', () => {
  let hlc = new HeroListComponent(mockService);
  expect(hlc.heroes.length).toEqual(expectedHeroes.length);
});
4

2 回答 2

4

添加到JB Nizet 的答案中,并对代码背后的推理进行一些解释。

TypeScript 使用结构类型系统1。这意味着如果它像鸭子一样嘎嘎叫,那么它可以被认为是鸭子(或者更准确地说,与鸭子兼容)。举个例子

class Duck {
  quack() { }
}

let duck = {
  quack: () => {}
}

由于duck有一个quack方法,你可以将它传递给任何期望 a 的东西Duck,比如

function doQuack(duck: Duck) {
  duck.quack();
}

doQuack(duck);

TypeScript 足够聪明,即使我们从未实际创建using的实例,duck也可以将对象字面量视为 a 。这是因为 的结构足以兼容类型,因为它匹配结构;该结构只是一种方法。DuckDuckduck = new Duck()duckDuckquack

如果我们尝试键入duckas Duck,但我们没有该quack方法,那么我们会得到一个编译错误。

let duck: Duck = {   // compile error
  mooo: () => {}
};

let duck: Duck = {
  quack: () => {}    // OK
}

话虽如此,以您的示例为例,它HeroSerivce有两种方法,一种是获取所有英雄,另一种是通过 id 获取英雄。

class HeroService {
  getHeroes(): Hero[] { .. }
  getHeroById(id: number): Hero { .. }
}

并且HeroComponent带有一个接受 a 的构造函数HeroService

class HeroComponent {
  constructor(heroService: HeroService) {}
}

现在,如果我们尝试通过以下

let mockService = { getHeroes: () => expectedHeroes }

对于HeroComponent构造函数,我们将得到一个编译错误,因为 与a的结构mockService不匹配。当结构实际上由两种方法组成时,它只有一种方法,并且.HeroServicegetHeroesgetHeroesgetHero

因此,为了强制编译器接受它,我们将其“强制转换”为<HeroService>.

我们可以通过以下内容(没有“强制转换”)并且它会起作用,因为它与结构匹配。

let mockService = {
  getHeroes: () => expectedHeroes,
  getHero: (id: number) => null
};

1 - 阅读 TypeScript 文档章节类型兼容性的更多信息

于 2016-10-02T08:48:50.547 回答
1

在 JavaScript 和 TypeScript 中,{a: b}是一个对象字面量。它定义了一个对象,其中一个属性a的值为b

所以

{getHeroes: () => expectedHeroes }

是具有一个名为 的属性的对象getHeroes,其值为() => expectedHeroes() => expectedHeroes。因此 value 是一个不带参数 ( ()) 并返回 value 的函数expectedHeroes

<HeroService>被称为类型断言

有时你会遇到比 TypeScript 更了解值的情况。通常,当您知道某个实体的类型可能比其当前类型更具体时,就会发生这种情况。

类型断言是告诉编译器“相信我,我知道我在做什么”的一种方式。类型断言类似于其他语言中的类型转换,但不执行数据的特殊检查或重组。它没有运行时影响,并且纯粹由编译器使用。

于 2016-10-02T06:48:28.313 回答