我试图在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中,接口在运行时会被删除".

推荐答案

无法导出接口.您只能导出:

  1. 其他模块
  2. 组件
  3. 指令

NgModule是一个Angular 概念,不应与typescript模块混淆.要使使用您的模块的第三方能够使用您的界面,您应该使用您的模块创建.d.ts定义文件.

如果你想在你的另一个模块中使用接口,你应该只使用:

import {InterfaceName} from 'path/to/ngmodule/to/interface';

另外,不要在声明数组中放置接口,这仅用于管道/组件/指令.

如果希望界面在库之外可用,则应将其添加到index.ts的导出中:

export {InterfaceName} from 'path/to/ngmodule/to/interface';

Typescript相关问答推荐

相交TypScript中的对象和接口

为什么当类类型与方法参数类型不兼容时,该函数可以接受类类型

从传递的数组中出现的值设置返回键的类型

如何正确修复TypScript 4.7到4.8升级中的TS 2345编译错误

TypeScript实用程序类型—至少需要一个属性的接口,某些指定属性除外

如何在单击停止录制按钮后停用摄像机?(使用React.js和Reaction-Media-Recorder)

如何消除在Next.js中使用Reaction上下文的延迟?

嵌套对象的类型

有没有办法防止类型交集绕过联合类型限制?

如何在Angular 服务中制作同步方法?

接受字符串或数字的排序函数

如何键入派生类的实例方法,以便它调用另一个实例方法?

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

为什么TypeScrip假定{...省略类型,缺少类型,...选取类型,添加&>}为省略类型,缺少类型?

将类型脚本函数返回类型提取到VSCode中的接口

使用强制转换编写打字函数的惯用方法

在打印脚本中将对象类型转换为数组

仅当类型为联合类型时映射属性类型

替换typescript错误;X类型的表达式可以';t用于索引类型Y;带有未定义

为什么我会得到一个;并不是所有的代码路径都返回一个值0;switch 中的所有情况何时返回或抛出?(来自vsCode/TypeScript)