【发布时间】:2022-02-09 02:36:53
【问题描述】:
我显然误解了 TSyringe 应该如何解析具有依赖关系的类。
我创建了一个最小的复制。在我的 index.tsx 中,我按照文档中的说明进行操作并导入 reflect-metadata。如果我注入一个没有依赖关系的 singleton 类,则此示例有效:
// index.tsx
import "reflect-metadata";
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
一个单例类:
// _A.ts
import {inject, singleton} from 'tsyringe';
@singleton()
export class A {
get_msg() {
return "Worked!";
}
}
以及使用它的组件:
// App.tsx
import React from 'react';
import './App.css';
import {container} from "tsyringe";
import {A} from "./_A";
interface Props {
a?: A
}
function App({a = container.resolve(A)}: Props) {
return (
<div className="App">
{a.get_msg()}
</div>
);
}
export default App;
当我运行应用程序时,Worked!文本按预期打印。
但是,如果我创建第二个名为 B 的单例:
// _B.ts
import {singleton} from 'tsyringe';
@singleton()
export class B {
get_msg() {
return "Worked!";
}
}
然后将B注入A得到消息:
// _A.ts
import {inject, singleton} from 'tsyringe';
import {B} from "./_B";
@singleton()
export class _A {
constructor(private b: B) {
}
get_msg() {
return this.b.get_msg();
}
}
然后它以Uncaught Error: TypeInfo not known for "A" 失败
我有:
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
在我的tsconfig.ts 上,正如他们在自述文件中指出的那样。
注射器不应该自动解析 B,将 B 注入 A,然后将 A 注入我的应用组件,以便我可以打印消息吗?
我错过了什么?
【问题讨论】:
标签: reactjs typescript dependency-injection tsyringe