Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将类导出为Angular2中的接口_Angular_Typescript_Angular2 Services - Fatal编程技术网

将类导出为Angular2中的接口

将类导出为Angular2中的接口,angular,typescript,angular2-services,Angular,Typescript,Angular2 Services,是否有方法将类导出为接口,然后在Angular 2中的另一个模块中导入该接口?我需要能够在某些组件的构造函数中注入类,例如应该注册为提供程序。为了同时用作接口和提供程序令牌,它可能是抽象类。这是如何在Angular代码库中完成的 如果具体类具有从抽象类继承的内容,则抽象类可以扩展: export abstract class Foo { abstract bar(); baz() { ... } } export class ConcreteFoo extends Foo { b

是否有方法将类导出为接口,然后在Angular 2中的另一个模块中导入该接口?我需要能够在某些组件的构造函数中注入类,例如应该注册为提供程序。

为了同时用作接口和提供程序令牌,它可能是抽象类。这是如何在Angular代码库中完成的

如果具体类具有从抽象类继承的内容,则抽象类可以扩展:

export abstract class Foo {
  abstract bar();

  baz() { ... }
}

export class ConcreteFoo extends Foo {
  bar() { ... }
}

...
provider: [{ provide: Foo, useClass: ConcreteFoo }]
...
否则,使抽象类不可扩展和不可实例化更安全:

export abstract class Foo {
  private constructor() {
    throw new Error('should not be instantiated directly');
  }

  abstract bar();
}

export class ConcreteFoo implements Foo {
  bar() { ... }
}
应该注意的是,任何类都可以用作TypeScript中的接口。因此,如果不需要区分接口和实现,那么它可能只是一个具体的类:

export class Foo {
  bar() { ... }

  baz() { ... }
}

...
provider: [Foo]
...
如有必要,可在以后用作接口:

export class SomeFoo implements Foo { ... }

...
provider: [{ provide: Foo, useClass: SomeFoo }]
...

你能详细说明或提供一个示例片段来描述你的意思吗。。现在还不清楚。@suraj哪个部分不清楚?你是说在typescript中?@suraj是的,angular2是唯一的typescript,我认为从技术上讲,它可以在ts、js或dart中。。应该注意的是,这与接口不同。例如,它引入了一个可以在运行时实例化的值。不要说这是一个糟糕的解决方案,但要谨慎使用。此外,按照注释中的建议实施
Foo
具有不同的含义。@AluanHaddad问题标题与实际问题不同,这在删除答案的注释中进行了讨论。因为
Foo
应该是一个提供者,是的,它显然存在于传输的JS代码中。当抽象类仅用作接口(例如,
const foo:foo=…
…implements foo…
)时,它不会被传输-这在源代码中也很常见。但如果继承它们,则会导致失败。您的意思是指仅在
implements
子句中列出的类吗?如果是这样,您应该使用
private constructor(){throw Error('invalid');}
,这样您也可以得到一个编译器检查是的,或者像上面的例子一样-如果
ConcreteFoo
没有继承自
Foo
,那么
Foo
可以抛出它的构造函数,因此,开发人员不会通过
provide:[Foo]
偶然获得noop服务。谢谢你提醒我关于
私有构造函数的事
,这是一个好消息。我很高兴。我决定澄清一下答案,以防有人被标题搞糊涂。