完整对象名称

时间:2015-01-27 15:03:49

标签: typescript

您好我是打字稿的新手,我想问一下是否有可能获得包括模块名称的类的全名

我有这样的模块

module System {
  export module Collections {
    export class MyClass{
    }
  }
}

}

比在另一个模块中我将创建MyClass的实例

var inst = new System.Collections.MyClass(); inst.AssemblyQualifiedName()=和结果将是字符串“System.Collections.MyClass”

我需要这个用于集合中的唯一标识实例/类型以及从字符串...

创建实例

类似于c#

中的AssemblyQualifiedName

感谢您的帮助

3 个答案:

答案 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

可能的解决方案

我不确定您为什么要或不需要这样做,但您的问题的一些可能解决方案可能是以下之一:

  1. 添加一个静态属性(例如fullyQualifiedName),其中包含一个包含完全限定名称的字符串。编写单元测试以运行模块,以确保在具有该静态属性的任何类上名称正确。
  2. 再次添加静态属性,但这次您的构建脚本会自动填写名称属性。
  3. 有一个在应用程序启动时运行的方法,它将填充传递给它的模块中任何类的静态属性。
  4. 示例

    如何执行此操作的示例如下:

    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;
    

    我没有对此进行过多次测试,但它可以帮助您了解并将其应用于我上面列出的任何可能的解决方案。