我尝试在NgModule声明中导出接口并导出并在编辑器中获取此错误(Visual Studio代码):[ts] 'MyInterface' only refers to a type, but is being used as a value here.
以下是示例代码 Edit-1 :
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { MaterialModule } from '@angular/material';
import { MyInterface } from './my.interface';
import { MyService } from './my.service';
@NgModule({
imports: [ CommonModule, FormsModule, MaterialModule.forRoot() ],
declarations: [ MyInterface],//<- this is causing the message
exports: [ MyInterface],
providers: [ MyService ]
})
export class MyModule { }
我发现in the answer to this post的一部分解释:“因为接口在运行时在TypeScript中被擦除”。 我目前正在将我的应用程序重构为功能模块,因此我现在无法对其进行测试:我是否可以仅通过从'./mypathto/my.interface'导入来使用这些接口?
答案 0 :(得分:29)
您无法导出界面。您只能导出:
NgModule
是一个角度概念,不应与打字稿模块混淆。要使使用您的模块的第三方能够使用您的界面,您应该使用您的模块创建.d.ts
定义文件。
如果你想在你的另一个NgModule中使用一个接口,你应该使用:
import {InterfaceName} from 'path/to/ngmodule/to/interface';
另外,不要在声明数组中放置接口,这仅用于管道/组件/指令。
如果您希望自己的界面可以在图书馆外使用,则应将其添加到导出index.ts
:
export {InterfaceName} from 'path/to/ngmodule/to/interface';
答案 1 :(得分:7)
实际上你可以导出一个界面,但不是你想要的方式。
首先输入
生成interfaces.ts文件 ng g interface <interface_name>
接口文件示例:
export interface Auction{ $key?:string; $auctioneer:string; ... }
export interface Item{ $key?:string; condition?:string; description?:string; ...}
export interface Bid{ $key?:string; amount:number; auction:string; ...}
根据需要修改文件后,您只能导入一个,所有或选择的界面:
import { Auction } from './interfaces';
或
import * as interfaces from './interfaces';
// then you have to call interfaces.Auction
如果有机会你知道如何在全球范围内共享接口。请告诉我:Angular how to share interfaces across the app