如何在打字稿中获取变量名称? 我想要这样的东西:
var name = "Foo";
alert(getVariableName(name)); //Prints "name"
答案 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
但是我认为应该在编译时完成而不是在运行时完成