- 当前 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
请自查
额。。。有提示吗?
在 reflect库的声明后面补一句赋值
import 'reflect-metadata' Reflect = global.Reflect // 相当于在小程序下会存在window.Reflect
import "reflect-metadata"; Object.getOwnPropertyNames(global.Reflect).forEach((key) => { Object.defineProperty(Reflect, key, { value: global.Reflect[key], }); });
使用 reflect-metadata,Reflect 被添加到了global 里面
我换了一个 ployfill,暂时没发现问题。
https://github.com/abraham/reflection
终于找到一样问题的地方了,请问大家解决了吗???
我这边也是一样遇到这个问题,请问各位有解决方案了吗?
问题有没有解决啊,我这边也是同样的问题出现了
【描述】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());