gpt4 book ai didi

javascript - TypeScript 中的方法名称

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:12 25 4
gpt4 key购买 nike

我可以获取 TypeScript 中方法的名称吗?例如像这样:

class C {
test() { return this.test.name; } // should return "test";
}

我可以通过扩展 Function 接口(interface)使其适用于函数:

interface Function {
name: string;
}

function f() {
return f.name; // returns "f"
}

我能否以某种方式使它也适用于方法?

最佳答案

简短的回答是否定的,匿名函数没有名称。

如果您担心的是编译错误,那么覆盖接口(interface)就足够了,因为接口(interface)是部分的。但是 Typescript 转换的方式实例方法不会有任何名称,因为它们只是对匿名函数的引用。即

它被编译为

var C = (function () {
function C() {
}

C.prototype.test = function () {
// ^__ There is no name for the function so
return this.test.name; // this will just be empty
};
return C;
})();

你会看到它打印 function.name 只有当它是这样的时候:

 C.prototype.test = function test() {
// ^__ Not anonymous anymore

我能想到的一种方法是使用装饰器并为属性设置值,比如 propName

interface Function {
propName?: string;
}

function setName(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) {
descriptor.value.propName = propertyKey;
//or target[propertyKey].propName = propertyKey;
return descriptor;
}

class C {
@setName
test() {
return this.test.propName;
}
}

这一切都与 Typescript 如何转译 class 有关。例如,如果您使用的是 Babel,due to the way it transpiles您将看到的规范将函数引用的值按原样分配给属性描述符,因此它将保留名称。

注意:并非所有浏览器都支持 Function.name无论如何(例如:较旧的 IE),属性 name 也不是跨浏览器的 Writable ,即您不能更改名称。所以配置另一个属性。

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

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