您好我是打字稿的新手,我想问一下是否有可能获得包括模块名称的类的全名
我有这样的模块
module System {
export module Collections {
export class MyClass{
}
}
}
}
比在另一个模块中我将创建MyClass的实例
var inst = new System.Collections.MyClass(); inst.AssemblyQualifiedName()=和结果将是字符串“System.Collections.MyClass”
我需要这个用于集合中的唯一标识实例/类型以及从字符串...
创建实例类似于c#
中的AssemblyQualifiedName感谢您的帮助
答案 0 :(得分:2)
您可以使用TypeScript编译器API(需要Node.js),例如:
import ts = require("typescript");
class Sample
{
private program: ts.Program = null;
constructor(sourceFiles: string[])
{
var options: ts.CompilerOptions = { noLib: true };
var host = ts.createCompilerHost(options)
this.program = ts.createProgram(sourceFiles, options, host)
this.program.getSourceFiles().forEach(file => this.doSomethingWithTheFile(file));
}
...
private getQualifiedName(node: ts.Node): string
{
var symbol = this.program.getTypeChecker().getSymbolAtLocation(node);
if (!symbol)
return null;
return this.program.getTypeChecker().getFullyQualifiedName(symbol);
}
}
答案 1 :(得分:1)
没有办法做到这一点。 JavaScript中的类只是值,并且没有机制可以说“我从哪里获取此值?”
答案 2 :(得分:1)
不,开箱即用是不可能的。有关详细参考,请参阅this answer。
可能的解决方案
我不确定您为什么要或不需要这样做,但您的问题的一些可能解决方案可能是以下之一:
fullyQualifiedName
),其中包含一个包含完全限定名称的字符串。编写单元测试以运行模块,以确保在具有该静态属性的任何类上名称正确。示例强>
如何执行此操作的示例如下:
module TestModule {
export class TestClass1 {
// initialize it to undefined or null to ensure the
// typescript compiler adds it as a property
static fullyQualifiedName: string = null;
}
export module OtherModule {
export class TestClass2 {
static fullyQualifiedName: string = null;
}
export class TestClass3 {
}
}
}
function fillFullyQualifiedName(m: any, name: string) {
// if it's a module
if (typeof m === "object") {
for (var prop in m) {
fillFullyQualifiedName(m[prop], name + "." + prop);
}
}
// else, if it's a class with the fullyQualifiedName property
else if (typeof m === "function" && m.hasOwnProperty("fullyQualifiedName")) {
m["fullyQualifiedName"] = name;
}
}
fillFullyQualifiedName(TestModule, "TestModule");
// some tests...
TestModule.TestClass1.fullyQualifiedName === "TestModule.TestClass1";
TestModule.OtherModule.TestClass2.fullyQualifiedName === "TestModule.OtherModule.TestClass2";
TestModule.OtherModule.TestClass3["fullyQualifiedName"] == null;
我没有对此进行过多次测试,但它可以帮助您了解并将其应用于我上面列出的任何可能的解决方案。