我有一个带有 Jest 的 Angular 应用程序,所有测试都运行良好。组件注入服务:
组件.ts:
import { FooService } from '../../services/foo.service'; // relative import
constructor(private foo: FooService) {}
Run Code Online (Sandbox Code Playgroud)
组件规格:
import { FooService } from '@services/foo.service'; // alias import
describe('FooComponent', () => {
let component: FooComponent;
let fixture: ComponentFixture<FooComponent>;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [....],
providers: [ { provide: FooService, useValue: { bar: () => {} } ],
declarations: [FooComponent],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
....
}));
});
Run Code Online (Sandbox Code Playgroud)
两个导入引用相同 foo.service.ts
,但使用不同形式的导入:TypeScript 别名vs相对路径。
别名在 tsconfig.json 中定义:
"paths": …
Run Code Online (Sandbox Code Playgroud) 我创建了一个简单的角度独立组件,它使用注入令牌进行配置:
export const PERSON_DEFAULT_OPTIONS = new InjectionToken<IPersonDefaults>('...')
export interface IPersonDefaults { ... }
export const providePersonDefaultOptions = (options: IPersonDefaults): Provider => ({
provide: PERSON_DEFAULT_OPTIONS,
useValue: options
})
@Component({...})
export class StandaloneComponent {
readonly #config = inject(PERSON_DEFAULT_OPTIONS, {optional: true})
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的 main.ts 中,我只需调用providePersonDefaultOptions()
我的价值观,一切都会很好。
现在我已经将该令牌/接口/组件放入 npm 库中。当我尝试再次运行该应用程序时,出现以下错误:
错误:NG0203:inject() 必须从注入上下文调用,例如构造函数、工厂函数、字段初始值设定项或使用的函数
EnvironmentInjector#runInContext
我不明白为什么该代码不能作为 npm 库工作,因为它仍然是一个正在设置的字段初始值设定项。
angular angular-library injection-tokens angular15 angular16