TypeScript 开发使用 inversify DI 库报错
发布于 5 年前 作者 xiulan98 2049 次浏览 来自 问答
  • 当前 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
2 回复

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

回到顶部