获取typescript中的变量名称

Ken*_*sen 14 typescript

如何在打字稿中获取变量名称?我想要这样的东西:

var name = "Foo";
alert(getVariableName(name)); //Prints "name"
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 18

扩展basarat的答案,您需要创建一个函数,该函数将一个函数作为参数,该函数将包含对变量的访问.因为在JavaScript中你可以访问任何函数的代码,然后使用正则表达式提取变量名称变得简单.

var varExtractor = new RegExp("return (.*);");
export function getVariableName<TResult>(name: () => TResult) {
    var m = varExtractor.exec(name + "");
    if (m == null) throw new Error("The function does not contain a statement matching 'return variableName;'");
    return m[1];
}

var foo = "";
console.log(getVariableName(() => foo));
Run Code Online (Sandbox Code Playgroud)


Dan*_*ker 7

一种方法是将这些值存储在对象中:

var o = {
    firstName: "Homer",
    lastName: "Simpson"
};
Run Code Online (Sandbox Code Playgroud)

我们无法获取 的名称o,但我们可以获取它的两个属性的名称(或“键”):

var k = Object.keys(o);
console.log(k[0]); // prints "firstName"
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有对象或不想创建命名对象,则可以将其表示为“Object.keys({ name })[0]”。 (2认同)

bas*_*rat 6

TypeScript是运行时的JavaScript.因此适用的限制相同:在Javascript中获取变量的"名称"

但是你可以做类似的事情

alert(getVariableName(()=>name)) 
Run Code Online (Sandbox Code Playgroud)

在这里,您将解析传递给getVariableName的函数体,并将其作为字符串获取.

  • 然而,TypeScript 被编译成 JavaScript,所以理论上它可以支持在编译期间工作的 `nameof(variableName)` 操作符。我想知道为什么他们不已经这样做了。这是有编译过程的好处之一,TS应该充分利用它。 (4认同)

Alo*_*lon 5

扩展 Cernicova-Dragomir 的答案:

扩展 basarat 的答案,您需要创建一个函数,该函数将一个函数作为参数,该函数将包含对您的变量的访问。因为在 JavaScript 中您可以访问任何函数的代码,所以使用正则表达式来提取变量名称变得很简单。

还支持对象的字段:

var varExtractor = new RegExp("(.*)");

export function getVariableName<TResult>(getVar: () => TResult) {
    var m = varExtractor.exec(getVar + "");

    if (m == null)
        throw new Error("The function does not contain a statement matching 'return variableName;'");

    var fullMemberName = m[1];
    var memberParts = fullMemberName.split('.');

    return memberParts[memberParts.length-1];
}

var foo = { bar: "" };
var varName = getVariableName(() => foo.bar ); //prints "bar"
Run Code Online (Sandbox Code Playgroud)

请注意,我删除了“return”,因为它在面向 ES6 时不适用于 Node.js。