gpt4 book ai didi

javascript - 在 TypeScript 中获取类方法的名称

转载 作者:数据小太阳 更新时间:2023-10-29 04:13:23 24 4
gpt4 key购买 nike

对于查看此内容的任何人,此问题类似于以下内容:

How do I get the name of an object's type in JavaScript?
Get an object's class name at runtime in TypeScript

然而,它在某些方面有所不同。

我正在寻找属于某个类的方法名称,并将其存储在 TypeScript/JavaScript 的变量中。
看看下面的设置:

class Foo {

bar(){
// logic
}

}

上面是有效的 TypeScript,我想在不同的类中创建一个方法,它将返回 bar() 方法的名称,即 "bar"
例如:

class ClassHelper {

getMethodName(method: any){
return method.name; // per say
}

}

然后我希望能够按以下方式使用 ClassHelper:

var foo = new Foo();
var barName = ClassHelper.getMethodName(foo.bar); // "bar"

我看了很多帖子,有些人建议使用以下内容:

var funcNameRegex = /function (.{1,})\(/;   
var results = (funcNameRegex).exec(obj.toString());
var result = results && results.length > 1 && results[1];

但这失败了,因为我的方法不是以 function
开头另一个建议是:

public getClassName() {
var funcNameRegex = /function (.{1,})\(/;
var results = (funcNameRegex).exec(this["constructor"].toString());
return (results && results.length > 1) ? results[1] : "";
}

这只返回类名,但是从阅读帖子来看,使用 constructor 似乎不可靠。

此外,当我使用其中一些方法调试代码时,像这样传递方法:ClassHelper.getMethodName(foo.bar); 将导致参数被传递,如果方法需要一个,例如:

class Foo {

bar(param: any){
// logic
}

}

var foo = new Foo();
var barName = ClassHelper.getMethodName(foo.bar); // results in param getting passed through

我已经为此苦苦挣扎了一段时间,如果有人有任何关于我如何解决这个问题的信息,我将不胜感激。

我的 .toString() 在传入的方法上返回这个:

.toString() = "function (param) { // code }"

而不是:

.toString() = "function bar(param) { // code }"

根据 MDN,它也不应该:

That is, toString decompiles the function, and the string returned includes the function keyword, the argument list, curly braces, and the source of the function body.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString#Description

最佳答案

我采纳了 John White 的想法并对其进行了改进,使其适用于我能想到的所有情况。这种方式的好处是运行时不需要解析js代码。但是有一个边缘情况,它根本无法推断出正确的属性名称,因为有多个正确的属性名称。

class Foo {
bar() {}
foo() {}
}

class ClassHelper {
static getMethodName(obj, method) {
var methodName = null;
Object.getOwnPropertyNames(obj).forEach(prop => {
if (obj[prop] === method) {
methodName = prop;
}
});

if (methodName !== null) {
return methodName;
}

var proto = Object.getPrototypeOf(obj);
if (proto) {
return ClassHelper.getMethodName(proto, method);
}
return null;
}
}

var foo = new Foo();
console.log(ClassHelper.getMethodName(foo, foo.bar));
console.log(ClassHelper.getMethodName(Foo.prototype, foo.bar));
console.log(ClassHelper.getMethodName(Foo.prototype, Foo.prototype.bar));

var edgeCase = { bar(){}, foo(){} };
edgeCase.foo = edgeCase.bar;
console.log(ClassHelper.getMethodName(edgeCase, edgeCase.bar));

关于javascript - 在 TypeScript 中获取类方法的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38118137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com