Typescript - 如何在转换时获取实例属性名称

时间:2016-07-05 06:58:38

标签: typescript

有没有人知道在Typescript中是否有一种方法可以在转换时输出实例属性的名称?

例如,假设我有一个班级:

class SomeClass {
   public someFn() { }
}

如何在创建SomeClass的任何实例之前生成以下伪代码?

string str = nameof(SomeClass.someFn)

注意,这是为了重新分解,所以我不想在代码中循环遍历原型;我只是想知道是否有一种时间的方式来做这件事?换句话说,有没有办法让Typescript转换器将实例属性的名称作为字符串吐出?

为什么呢?我想要一种能够访问可重新分解安全的实例的已知属性的方法,并且 - 与someInstance.someFn不同 - 不是在转换时确定的。因此,您可以使用switch语句来访问不依赖于魔术字符串并且可以重构的不同属性。例如而不是在代码中编写以下内容:

switch(input){
     case "someFn":
          return someObj["someFn"]();
}

我可以写下以下内容:

switch(input){
    case nameof(SomeClass.someFn):
        return someObj[nameof(SomeClass.someFn]();
}

这个想法是someFn变量的全局重命名将在switch语句中传播。

3 个答案:

答案 0 :(得分:0)

我不确定你要做什么因为这个:

switch (input) {
    case nameof(SomeClass.someFn):
        return someObj[nameof(SomeClass.someFn]();
}

只有在input === "someFn"时才能使用,并且您正在使用代码SomeClass.someFn进行编写,因此您具体了解someFn
既然如此,则出现了什么问题:

switch (input) {
    case "someFn":
        return someObj["someFn"]();
}

如果您只想确保input中的字符串是SomeClass中的现有方法,那么您可以:

if (Object.keys(SomeClass.prototype).indexOf(input) >= 0 && typeof SomeClass.prototype[input] === "function") {
    return someObj[input]();
}

答案 1 :(得分:0)

要获取没有任何魔术字符串的实例方法的名称,并且以可重构的方式,您可以使用以下内容:SomeClass.prototype.someFn.name

答案 2 :(得分:0)

我猜测有更好的方法,但没有用字符串引用方法,That section(记录“函数名称是someMethod”)

attach