收藏
回答

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
回答关注问题邀请回答
收藏

3 个回答

  • Can🌴
    Can🌴
    2019-01-03

    请自查

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

      额。。。有提示吗?

      2019-01-03
      回复
  • Six006
    Six006
    04-24

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

    04-24
    有用
    回复
  • 刘挺 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
    有用
    回复
登录 后发表内容