首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何导入/使用打字本中的反射

如何导入/使用打字本中的反射
EN

Stack Overflow用户
提问于 2016-12-21 19:47:28
回答 4查看 21.5K关注 0票数 11

我正在尝试使用this SO answer中的代码。它使用反射。这里有一份副本:

代码语言:javascript
复制
export function CustomComponent(annotation: any) {
  return function (target: Function) {
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor;
    var parentAnnotations = Reflect.getMetadata('annotations', parentTarget);

    var parentAnnotation = parentAnnotations[0];
    Object.keys(parentAnnotation).forEach(key => {
      if (isPresent(parentAnnotation[key])) {
        annotation[key] = parentAnnotation[key];
      }
    });
    var metadata = new ComponentMetadata(annotation);

    Reflect.defineMetadata('annotations', [ metadata ], target);
  }
}

首先,我得到了以下两个错误:

代码语言:javascript
复制
Property 'getMetadata' does not exist on type 'typeof Reflect'.
Property 'defineMetadata' does not exist on type 'typeof Reflect'.

然后我运行了npm install reflect-metadata,但我不知道如何使用它。

代码语言:javascript
复制
import { Reflect } from reflect-metadata;

Module '".../node_modules/reflect-metadata/index"' has no exported
member 'Reflect'.

代码语言:javascript
复制
import { Reflect } from 'reflect-metadata/Reflect';

Cannot find name 'Record'. 
Type '{}' is not assignable to type 'V'.
File '.../node_modules/reflect-metadata/Reflect.ts' is not a module.

代码语言:javascript
复制
import "reflect-metadata"

rollup: Treating 'fs' as external dependency 
bundle update failed: Error transforming .../node_modules/typescript/lib/typescript.js
with 'commonjs' plugin: The keyword 'package' is reserved (57066:28) in
.../node_modules/typescript/lib/typescript.js 

代码语言:javascript
复制
var reflect = require("reflect-metadata");

Cannot find name 'require'.

代码语言:javascript
复制
declare var require: any;
var reflect = require("reflect-metadata");
var Reflect = reflect.Reflect;

    rollup: Treating 'fs' as external dependency 
bundle update failed: Error transforming .../node_modules/typescript/lib/typescript.js
with 'commonjs' plugin: The keyword 'package' is reserved (57066:28) in
.../node_modules/typescript/lib/typescript.js

当然,我只是错过了一些愚蠢的东西,甚至是一个错误。我能做些什么来使用这段代码?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-21 21:20:20

您必须将类型声明与(js)库一起导入

代码语言:javascript
复制
npm install reflect-metadata -D

在您的.ts文件中:

代码语言:javascript
复制
 import "reflect-metadata";
票数 23
EN

Stack Overflow用户

发布于 2018-06-01 13:18:18

到目前为止,@types/reflect-metadata已不再受欢迎,因为reflect-metadata已经包含了它自己的类型。

因此,要使用它们,只需导入库(使用全局范围)。就这样。

  1. 安装: npm install reflect-metadata --save
  2. 进口: import 'reflect-metadata';
票数 11
EN

Stack Overflow用户

发布于 2016-12-21 21:10:49

类型记录使用的模块加载模式与JavaScript略有不同。

假设您有一个模块Modulus,它定义了三个类ABC

代码语言:javascript
复制
import { A } from "Modulus"

将从模块A导入类(或函数),并使其在当前模块中可用。如果类型记录在A中没有找到名为Modulus的导出,则会引发错误。

代码语言:javascript
复制
// Equivalent to the following in JavaScript:
// var ModuleNameOfYourChoice = require("Modulus")

import * as ModuleNameOfYourChoice from "Modulus"

将导入在Modulus中声明的所有导出,并将它们以ModuleNameOfYourChoice的名称提供给当前模块。

对于您的代码,您需要在reflect-metadata模块中定义的所有导出,因此需要将它作为

代码语言:javascript
复制
import * as Reflect from "reflect-metadata"

万事如意!

打字稿文档:http://www.typescriptlang.org/docs/handbook/modules.html#import

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41270800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档