获取typescript中的变量名称

时间:2015-03-22 05:50:33

标签: typescript

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

var name = "Foo";
alert(getVariableName(name)); //Prints "name"

5 个答案:

答案 0 :(得分: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));

答案 1 :(得分:6)

TypeScript是运行时的JavaScript。因此适用的局限性相同:Get the 'name' of a variable in Javascript

但是你可以做像

这样的事情
alert(getVariableName(()=>name)) 

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

答案 2 :(得分:3)

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

var o = {
    firstName: "Homer",
    lastName: "Simpson"
};

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

var k = Object.keys(o);
console.log(k[0]); // prints "firstName"

答案 3 :(得分:3)

扩大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"

请注意,我删除了“return”,因为它在定位ES6时无法在Node.js上运行。

答案 4 :(得分:0)

//typescript
function getVarName(obj: object): string {
  const keys = Object.keys(obj);
  console.assert(keys.length == 1, 'key count must be 1');
  return keys[0];
}
const simpleName = 123;
console.log(getVarName({ simpleName }), simpleName);

//javascript
"use strict";
function getVarName(obj) {
    const keys = Object.keys(obj);
    console.assert(keys.length == 1, 'key count must be 1');
    return keys[0];
}
const simpleName = 123;
console.log(getVarName({ simpleName }), simpleName);

它将输出

[LOG]:simpleName,123

但是我认为应该在编译时完成而不是在运行时完成