Inversify.js - Reflect.hasOwnMetadata不是一个函数

Jos*_*e A 20 javascript asp.net-mvc typescript inversifyjs

我正在尝试Inversify.js我正在使用的Typescript应用程序.现在,没有涉及框架,所以它是纯粹的ES2015.

我正在尝试按照主页面中的示例进行操作,但当我尝试在浏览器中运行时,我遇到了:"Reflect.hasOwnMetadata不是函数".

我正在使用Webpack作为包捆绑器.

这是我的文件夹结构:

在此输入图像描述

这是主要的app.ts文件:

/// <reference path="../typings/index.d.ts" />
/// <reference path="./domain/abstract/match.interface.ts" />

import kernel from "../inversify/inversify.config.ts";

import {symbols} from "../inversify/symbols.ts";

var ninja = kernel.get<INinja>("INinja");

ninja.fight();
ninja.sneak();
Run Code Online (Sandbox Code Playgroud)

interfaces.d.ts:

interface INinja {
    fight(): string;
    sneak(): string;
}

interface IKatana {
    hit(): string;
}

interface IShuriken {
    throw();
}
Run Code Online (Sandbox Code Playgroud)

inversify.config.ts

/// <reference path="../node_modules/inversify/type_definitions/inversify/inversify.d.ts" />
/// <reference path="../node_modules/reflect-metadata/reflect-metadata.d.ts" />
/// <reference path="inversify.ts" />

import {Kernel} from "inversify"
//import {MatchHub} from "../app/components/Hubs/match/match-hub.component.ts";
//import {symbols} from "./symbols.ts";


import {Ninja, Katana, Shuriken} from "./inversify.ts";


var kernel = new Kernel();
kernel.bind<INinja>("INinja").to(Ninja);
kernel.bind<IKatana>("IKatana").to(Katana);
kernel.bind<IShuriken>("IShuriken").to(Shuriken);


export default kernel;
Run Code Online (Sandbox Code Playgroud)

symbols.ts:

export const symbols = {
    Match : Symbol("Match")
}
Run Code Online (Sandbox Code Playgroud)

tsconfig.json:

{
  "compilerOptions": {
    "noImplicitAny": false,
    "experimentalDecorators": true,
    "emitDecoratorMetadata":  true, 
    "removeComments": true,
    "sourceMap": true,
    "target": "es5"
  },
  "exclude": [
    "node_modules",
    "bower_components",
    "wwwroot"
  ]
}
Run Code Online (Sandbox Code Playgroud)

Webpack.config.js:

module.exports = {
  entry: './app/app.ts',
  output: {
    filename: '../Scripts/app/app.js'
  },
  resolve: {
      extensions: ['', '.Webpack.js', '.web.js', '.ts','.js', '.tsx']
  },
  module: {
    loaders: [
        {
          test: /\.ts?$/,
          exclude: /(node_modules|bower_components)/,
          loader: 'ts-loader'
        }
    ]
  },
  watch: true
}
Run Code Online (Sandbox Code Playgroud)

Firefox控制台错误:

firefox控制台错误

Webpack输出:

在此输入图像描述

当我尝试安装Inversify时,会弹出以下警告:

在此输入图像描述

这是一个错误吗?或者我做错了什么?谢谢!

PS:尝试过样本文件,但我什么都听不懂!

我来自ASP.NET MVC 5与Ninject,所以我可以联系大多数语法.

Dav*_*ret 52

您似乎需要包含reflect-metadata包.尝试通过执行以下操作在inversify.config.ts为其添加导入:

import "reflect-metadata";
Run Code Online (Sandbox Code Playgroud)

  • 我建议将"reflect-metadata"导入放在顶部(*inversify.config.ts*).在导入`@ injectable`类之前我遇到了这个问题. (6认同)
  • 您好我是inversifyJS的主要作者,导入"reflect-metadata"应该可以解决您的问题. (3认同)

Mah*_*esh 38

可能是一个愚蠢的事情要指出,我遇到了同样的问题,但这是因为进口的顺序.对于任何其他导入都不太可能出现这种情况,但在反射元数据的情况下,必须在使用它之前导入它.

import { Container } from "inversify";
//reflect-metadata should be imported 
//before any interface or other imports
//also it should be imported only once
//so that a singleton is created.
import "reflect-metadata";
import Battle from "./interfaces/battle";
import EpicBattle from "./interfaces/epic_battle";
Run Code Online (Sandbox Code Playgroud)

  • 然后叫我傻.事后看来有点愚蠢,但如果在文档中指出这将是好的. (5认同)
  • ET!这节省了我时间! (4认同)