我将问题减少到了这个示例:
test.model.ts
export class A {
a: number;
}
export interface B {
b: number;
}
test.component.ts
import { Component, Input } from '@angular/core';
import { A, B } from './test.model';
@Component({
selector: 'test',
template: '<h1>test</h1>'
})
export class TestComponent {
//This works fine
@Input() foo: A;
//Does NOT work - export 'B' was not found in './test.model'
@Input() bar: B;
}
当我想使用接口时,我会以下警告:
WARNING in ./src/app/.../test.component.ts
21:76 export 'B' was not found in './test.model'
但是,使用 class 是可以的。有提示吗?
update :它似乎与此问题有点相关:https://github.com/webpack/webpack/webpack/issues/2977
根本原因在于打字和转介。一旦将打字稿代码转移,接口/类型就消失了。它们不再存在于发射的文件中。
虽然删除了类型,但进口/导出不一定是。原因是存在歧义,并且编译器并不总是确定导出的东西是一种类型还是价值。
使用TypeScript 3.8
及向上时,您需要在test.component.ts
中使用的只是以下内容:
import { A } from './test.model';
import type { B } from './test.model';
您也可以通过使用Typescript 3.8
中的新功能来解决该问题,称为仅类型的导入和导出。
因此,这意味着您可以像这样导入有问题的类型A
:
import { B } from './test.model';
import type { A } from './test.model';
还请注意,Angular似乎仅支持Angular 9.1及以上的TypeScript 3.8。
我还建议阅读此"利用类型的输出和输出键入3.8"帖子以获取更多详细信息。
昨天我在这里找到了另一个问题,并将其声明输出接口的解决方案单独的文件。每个文件都有一个接口,它对我有用,没有任何警告。
删除警告的另一种方法是与自身界面结合的略微令人讨厌的骇客。
@Input() bar: B | B;
这对我有用:
@Input() bar: B | null;
使用Angular 4.4.3 打字稿2.3.4
我有一个错误,其接口在其自己的myinterface.ts
文件中定义,然后运行业力测试。运行ng serve
时,我看不到问题。在myinterface.ts
文件中添加1个未使用的const的export
解决了问题:
export interface IMyInterface {
...
}
export const A = 'A';