javascript - Inversify.js - Reflect.hasOwnMetadata er ikke en funksjon


Jeg prøver ut Inversify.js for en Typescript-applikasjon jeg bruker. Akkurat nå er det ingen rammeverk involvert, så det er ren ES2015.

Jeg prøver å følge eksemplet på hovedsiden, men jeg får: "Reflect.hasOwnMetadata er ikke en funksjon" når jeg prøver å kjøre det i nettleseren.

Jeg bruker Webpack som pakkesamler.

Her er mappestrukturen min:

Her er hovedfilen 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();

interfaces.d.ts:

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

interface IKatana {
    hit(): string;
}

interface IShuriken {
    throw();
}

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;

symbols.ts:

export const symbols = {
    Match : Symbol("Match")
}

tsconfig.json:

{
  "compilerOptions": {
    "noImplicitAny": false,
    "experimentalDecorators": true,
    "emitDecoratorMetadata":  true, 
    "removeComments": true,
    "sourceMap": true,
    "target": "es5"
  },
  "exclude": [
    "node_modules",
    "bower_components",
    "wwwroot"
  ]
}

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
}

Firefox-konsollfeil:

Webpack-utdata:

Da jeg prøvde å installere Inversify, dukket følgende advarsler opp:

Er det en feil? Eller gjør jeg noe galt? Takk!

PS: Prøvde å følge eksempelarkene, men jeg forsto ingenting!

Jeg kommer fra ASP.NET MVC 5 med Ninject, så jeg kan relatere til mesteparten av syntaksen.

Svar #1

Det ser ut til at du må inkludere reflect-metadata-pakken. Prøv å legge til et import i inversify.config.ts ved å gjøre:

import "reflect-metadata";

Svar #2

Det kan være en dum ting å påpeke, jeg støtte på det samme problemet, men det var på grunn av rekkefølgen på importene. Det er usannsynlig at det gjelder for andre imports, men i tilfelle av reflect-metadata må det importeres før noen klasser som bruker det.

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";

Relaterte artikler