收藏
回答

TypeScript 开发使用 inversify DI 库报错

框架类型 问题类型 操作系统 工具版本
小程序 Bug macOS 1.02.1812271

- 当前 Bug 的表现(可附上截图)


- 预期表现

应该能够正确加载 reflect-metadata npm 包。

- 复现路径

  1. 使用 TS 创建小程序项目

  2. npm i inversify reflect-metadata --save

  3. 根据 inversify 官方起始文档,编写 DI 相关代码

  4. 在小程序开发者工具,菜单点击 工具-》构建 NPM

  5. 编译小程序,并查看运行结果


  6. 报错。


SOF 上,https://stackoverflow.com/questions/37534890/inversify-js-reflect-hasownmetadata-is-not-a-function,解决的方法是直接引用:import "reflect-metadata", 然鹅,开发工具似乎并没有正确处理?


- 提供一个最简复现 Demo


最后一次编辑于  2019-01-03
回答关注问题邀请回答
收藏

8 个回答

  • 工号 9527
    工号 9527
    2019-01-03

    请自查

    2019-01-03
    有用
    回复 2
    • 卡夫卡
      卡夫卡
      2019-01-03

      额。。。有提示吗?

      2019-01-03
      回复
    • Zhao ZW
      Zhao ZW
      2021-05-19回复卡夫卡
      解决了么?同样问题
      2021-05-19
      回复
  • 2021-07-22

    在 reflect库的声明后面补一句赋值

    import 'reflect-metadata'
    Reflect = global.Reflect   // 相当于在小程序下会存在window.Reflect
    
    2021-07-22
    有用 1
    回复
  • 花菜
    花菜
    2022-03-15
    import "reflect-metadata";
    Object.getOwnPropertyNames(global.Reflect).forEach((key) => {
      Object.defineProperty(Reflect, key, {
        value: global.Reflect[key],
      });
    });
    
    2022-03-15
    有用
    回复
  • 陈晓峰 Sylvan
    陈晓峰 Sylvan
    2021-09-19

    使用 reflect-metadata,Reflect 被添加到了global 里面

    我换了一个 ployfill,暂时没发现问题。

    https://github.com/abraham/reflection

    2021-09-19
    有用
    回复
  • Zhao ZW
    Zhao ZW
    2021-05-19

    终于找到一样问题的地方了,请问大家解决了吗???

    2021-05-19
    有用
    回复
  • 阿凌
    阿凌
    2021-03-09

    我这边也是一样遇到这个问题,请问各位有解决方案了吗?

    2021-03-09
    有用
    回复 1
    • Zhao ZW
      Zhao ZW
      2021-05-19
      你解决了吗??
      2021-05-19
      回复
  • 2020-04-24

    问题有没有解决啊,我这边也是同样的问题出现了

    2020-04-24
    有用
    回复 1
    • Zhao ZW
      Zhao ZW
      2021-05-19
      解决了么??
      2021-05-19
      回复
  • Tim
    Tim
    2019-03-27

    【描述】TypeError: Reflect.hasOwnMetadata is not a function。我也认为这是微信开发工具的bug,inversify 和reflect-metadata包在standalone(非小程序环境)的ts项目里可以无错执行。但是在微信开发工具中报错,会报同样错的DI包还有https://www.npmjs.com/package/@abraham/reflection


    【造成的影响】经典的DI框架不能用在小程序中,影响OO开发体验,很难受,还请告知如何解决


    【示例代码】

    Inversify示例github代码地址:https://github.com/lubancafe/inversify-class-example


    主要问题代码段如下(可插入小程序的app.ts中复现题主的错误):

    import "reflect-metadata";

    import { Container, injectable } from "inversify";


    @injectable()

    class Katana {

        public hit() {

            return "cut!";

        }

    }


    @injectable()

    class Shuriken {

        public throw() {

            return "hit!";

        }

    }


    @injectable()

    class Ninja implements Ninja {


        private _katana: Katana;

        private _shuriken: Shuriken;


        public constructor(katana: Katana, shuriken: Shuriken) {

            this._katana = katana;

            this._shuriken = shuriken;

        }


        public fight() { return this._katana.hit(); };

        public sneak() { return this._shuriken.throw(); };


    }


    var container = new Container();

    container.bind<Ninja>(Ninja).to(Ninja);

    container.bind<Katana>(Katana).to(Katana);

    container.bind<Shuriken>(Shuriken).to(Shuriken);


    const ninja = container.get<Ninja>(Ninja);



    console.log(ninja.fight());

    console.log(ninja.sneak());


    2019-03-27
    有用
    回复
登录 后发表内容