2015-01-27 2 views
0

Привет там Я новичок в машинописи и я хотел бы спросить, если это возможно получить полное имя класса включают в себя имена модулейПолное имя объекта

У меня есть модуль, как этот

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

}

, чем в другом модуле я создаст экземпляр MyClass

вар инст = новый System.Collections.MyClass(); inst.AssemblyQualifiedName() = и результат будет строка «System.Collections.MyClass»

мне это нужно для уникальных идентифицирующих экземпляра/типов в коллекции и для создания экземпляра из строки ...

Что-то вроде AssemblyQualifiedName в C#

спасибо за вашу помощь

+0

Я могу имя класса прибудет GetType(): Тип { вернуть новый тип (this.constructor.toString() .match (/ function (\ w *) /) [1]); } нравится это, но namespase? –

ответ

1

Нет, это невозможно сразу из коробки. См. this answer для получения дополнительной информации.

Возможные решения

Я не уверен, почему вы хотите или должны сделать это, но некоторые возможные решения вашей проблемы может быть один из следующих:

  1. Добавить static (например, fullyQualifiedName), который содержит строку с полным именем. Напишите модульный тест для работы через ваши модули, чтобы убедиться, что имя верное для любого класса, у которого есть это статическое свойство.
  2. Добавьте статическое свойство снова, но на этот раз ваш скрипт сборки автоматически заполнит свойство name.
  3. Имейте метод, который запускается в начале вашего приложения, которое заполнит статическое свойство любых классов в модуле, переданном ему.

Пример

Пример того, как сделать это следующим образом:

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; 

Я не проверял, что очень много, но это должно помочь вам получить идею и применить это к любому из возможных решений, перечисленных выше.

+0

Я думаю, что это работает только для экспортируемых свойств. – Thomas

+0

@Thomas yeah, если класс или модуль не экспортируется, то это не сработает. –

1

Существует не способ сделать это. Классы в JavaScript - это просто значения, и нет механизма, чтобы сказать «откуда я получил это значение?».

1

Вы можете использовать машинопись компилятор 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); 
     } 
    } 
Смежные вопросы