- 当前 Bug 的表现(可附上截图)
- 预期表现
应该能够正确加载 reflect-metadata npm 包。
- 复现路径
使用 TS 创建小程序项目
npm i inversify reflect-metadata --save
根据 inversify 官方起始文档,编写 DI 相关代码
在小程序开发者工具,菜单点击 工具-》构建 NPM
编译小程序,并查看运行结果
报错。
SOF 上,https://stackoverflow.com/questions/37534890/inversify-js-reflect-hasownmetadata-is-not-a-function,解决的方法是直接引用:import “reflect-metadata”, 然鹅,开发工具似乎并没有正确处理?
- 提供一个最简复现 Demo
【描述】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”;
class Katana {
public hit() {
return “cut!”;
}
}
class Shuriken {
public throw() {
return “hit!”;
}
}
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());