首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使tsyringe (dep注入库)解析具有依赖关系的类?

如何使tsyringe (dep注入库)解析具有依赖关系的类?
EN

Stack Overflow用户
提问于 2022-02-06 19:14:54
回答 1查看 762关注 0票数 0

显然,我误解了TSyringe应该如何解决带有依赖关系的类。

我创造了一个最小的复制。在我的index.tsx中,我按照文档中的指示进行操作,并导入reflect-metadata。如果我注入一个没有依赖项的singleton类,则此示例有效:

代码语言:javascript
复制
// 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'));

一个单例类:

代码语言:javascript
复制
// _A.ts
import {inject, singleton} from 'tsyringe';

@singleton()
export class A {    
    get_msg() {
        return "Worked!";
    }
}

以及使用它的组件:

代码语言:javascript
复制
// 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;

当我运行这个应用程序时,它已经成功了!文本按预期打印。

但是,如果我创建了第二个名为B的单例:

代码语言:javascript
复制
// _B.ts
import {singleton} from 'tsyringe';

@singleton()
export class B {
    get_msg() {
        return "Worked!";
    }
}

然后将B注入A以获取消息:

代码语言:javascript
复制
// _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"中失败了

我有:

代码语言:javascript
复制
"experimentalDecorators": true,
"emitDecoratorMetadata": true,

在我的tsconfig.ts上,正如他们在自述中所指出的那样。

注射器不应该自动解析B,将B注入A,然后注入A到我的应用程序组件中,这样我就可以打印消息了吗?

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-07 16:00:19

好吧,所以我想明白了。

为了保留类型记录元数据并允许反射元数据完成其任务,我们需要向项目中添加babel-plugin-transform-typescript-metadata

然而,为了自定义创建-反应-应用程序,您需要craco库。有几个存在,但craco是我唯一可以支持CRA4.x的。您不能使用最新版本(CRA5.0),因为这些库都不支持它。

所以:

1-安装Craco并设置它。

2-将babel-plugin-transform-typescript-metadata安装为dev依赖项

3-向项目中添加一个craco.config.js文件以加载此插件:

代码语言:javascript
复制
module.exports = function ({ env: _env }) {
    return {
        babel: {
            plugins: [
                "babel-plugin-transform-typescript-metadata"
            ]
        },
    };
};

4-确保更新您的package.json以便使用craco启动,以便进行配置覆盖:

代码语言:javascript
复制
  "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "craco eject"
  },

就这样,现在起作用了。希望它能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71010774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档