我试图使用this SO answer中的代码。它使用Reflect。这是一份副本:
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);
}
}
首先,我遇到了这两个错误:
Property 'getMetadata' does not exist on type 'typeof Reflect'.
Property 'defineMetadata' does not exist on type 'typeof Reflect'.
然后我跑了npm install reflect-metadata
,但我不知道如何使用它。
import { Reflect } from reflect-metadata;
Module '".../node_modules/reflect-metadata/index"' has no exported
member 'Reflect'.
或者
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.
或
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
或者
var reflect = require("reflect-metadata");
Cannot find name 'require'.
或者
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
当然,我只是错过了一些愚蠢的东西,甚至是错字。如何使用此代码?
答案 0 :(得分:14)
您必须将类型声明与(js)库一起导入
npm install @types/reflect-metadata --save
npm install reflect-metadata --save
在您的.ts文件中:
import "reflect-metadata";
答案 1 :(得分:4)
截至今天,@types/reflect-metadata
已被弃用,因为reflect-metadata
已包含其自己的类型。
因此,要使用它们,您只需要导入库(使用全局范围)。就是这样。
安装:
npm install reflect-metadata --save
导入它:
import 'reflect-metadata';
答案 2 :(得分:2)
Typescript使用的模块加载范例与JavaScript略有不同。
假设您有一个模块Modulus
,它定义了三个类A
,B
和C
。
import { A } from "Modulus"
将从模块A
导入类(或函数)Modulus
,并使其在当前模块中可用。如果Typescript在A
中找不到名为Modulus
的导出,则会抛出错误。
// Equivalent to the following in JavaScript:
// var ModuleNameOfYourChoice = require("Modulus")
import * as ModuleNameOfYourChoice from "Modulus"
将导入Modulus
内声明的所有导出,并使其可用于名为ModuleNameOfYourChoice
的当前模块。
对于您的代码,您需要reflect-metadata
模块中定义的所有导出,因此需要将其导入为
import * as Reflect from "reflect-metadata"
一切顺利!
打字稿文档:http://www.typescriptlang.org/docs/handbook/modules.html#import
答案 3 :(得分:0)
如果可以使用es7 +,我发现了另一个解决方案。因此,在您的tsconfig.json
文件中,您只需要更改一行。将"target"
的分配更改为至少 es2017 。现在,您可以立即使用Reflect
。我认为这是一个很好的解决方案,因为您不必关心其他依赖项
示例tsconfig.json
{
"compilerOptions": {
"experimentalDecorators": true,
"outDir": "../dist",
"module": "umd",
"target": "es2017",
"sourceMap": true,
"noImplicitAny": true,
"strictNullChecks": true,
"removeComments": false,
"moduleResolution": "node"
},
"exclude": [
"node_modules",
"bower_components",
"dist"
]
}