获取typescript中变量的名称

获取typescript中变量的名称,typescript,Typescript,如何在typescript中获取变量名称? 我想要这样的东西: var name = "Foo"; alert(getVariableName(name)); //Prints "name" TypeScript在运行时是JavaScript。因此,同样的限制也适用于: 但是你可以做像这样的事情 alert(getVariableName(()=>name)) 在这里,您将解析传递到getVariableName中的函数体,并将其作为字符串获取 一种方法是将这些值存储在对象中: va

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

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

TypeScript在运行时是JavaScript。因此,同样的限制也适用于:

但是你可以做像这样的事情

alert(getVariableName(()=>name)) 

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

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

var o = {
    firstName: "Homer",
    lastName: "Simpson"
};
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"
我们无法获取
o
的名称,但可以获取其两个属性的名称(或“键”):

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

扩展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));
var varExtractor=newregexp(“return(.*);”;
导出函数getVariableName(名称:()=>TResult){
var m=varExtractor.exec(名称+“”);
如果(m==null)抛出新错误(“该函数不包含与“return variableName;”匹配的语句”);
返回m[1];
}
var foo=“”;
log(getVariableName(()=>foo));

扩展Cernicova Dragomir的答案:


扩展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));
要同时支持对象的字段,请执行以下操作:

var o = {
    firstName: "Homer",
    lastName: "Simpson"
};
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"
var varExtractor=newregexp((*);
导出函数getVariableName(getVar:()=>TResult){
var m=varExtractor.exec(getVar+“”);
如果(m==null)
抛出新错误(“该函数不包含与“return variableName;”匹配的语句”);
var fullMemberName=m[1];
var memberParts=fullMemberName.split('.');
返回memberParts[memberParts.length-1];
}
var foo={bar:'};
var varName=getVariableName(()=>foo.bar)//打印“条”
请注意,我删除了“return”,因为它在以ES6为目标的Node.js上不起作用

//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
“严格使用”;
函数getVarName(obj){
常量键=对象键(obj);
assert(keys.length==1,'键计数必须为1');
返回键[0];
}
常数simpleName=123;
log(getVarName({simpleName}),simpleName);
它将输出

[日志]:simpleName,123


但是我认为它应该在编译时完成,如果我没有弄错的话,在运行时会更好,对于对象的属性,这将返回类限定名,例如:
Foo.bar
。要仅返回属性名,可以使用
m[1].substring(Math.max(0,m[1].lastIndexOf(“.”))仅返回最后一个点后的名称部分。
Math.max
调用用于处理
lastIndexOf
将返回
-1
的情况,在这种情况下,应返回整个字符串(从索引
0
)。某些缩略不会从函数体中删除“;”,因此使用新的RegExp(“return(.*))更安全;然后用空字符串替换“;”并对其进行修剪。我添加了一个变体,允许检索完整路径@PeterMorris最初的问题是关于一个变量名,这个变量名不会被其他任何东西限定。代码将获取在参数上访问的属性(或属性路径)。这也是一个非常有用的函数,只是对另一个问题的回答:)我创建了一个库,它添加了一个
nameof
函数:。您也可以将其用于仅在TypeScript中可用的部分语言(例如接口和类型别名)。但是,TypeScript被编译成JavaScript,因此理论上它可以支持编译期间工作的
nameof(varibleName)
操作符。我想知道他们为什么还没有这么做。这是编译过程的好处之一,TS应该充分利用它。