打字稿:如何在没有TS2339错误的情况下将函数名称获取为字符串

Typescript: how to get function name as string without TS2339 error

我在 Function.name documentation

中找到了以下示例
const o = {
  foo(){}
};
o.foo.name; // "foo";

打字稿中的问题(在此处输入):

    const o: { foo: () => void } = {
        foo: () => {
        }
    };
    o.foo.name;

想取回就来 o.foo.name,我会得到一个错误

TS2339 (property "name" does not exist)

如何处理它,保持对象键入? 我想避免像 (<any>o.foo).name

这样的 属性 "foo"

PS:用例是为了进一步重构保留输入。例如,可以安全地重构以下内容:

spyOn(o, (<any>o.foo).name)

虽然这个不是

spyOn(o, "foo")

PS 2:在 ts 上检索函数名称似乎有问题:Get name of function in typescript

Post ES2015, 这个:

const o: { foo: () => void } = {
    foo: () => { }
};
console.log(o.foo.name); 

应该可以正常工作。

Typescript Playground中检查,观察生成的JavaScript。您将看到带有您提到的 foo 示例的公共部分。

这是控制台,干净整洁:


ES2015 之前,这是行不通的,我想你必须投它,如果目标 post-ES2​​015 不是一个选项。

问题在于此代码仅适用于较新版本的 Javascript。如果将打字稿编译器设置中的目标更改为 es2015 ,问题就会消失。如果您以 es5 为目标,则该版本的定义不包括 name 属性,因为它可能不适用于较旧的 Javascript 运行时。

如果你对 es2015 没问题,那没关系,否则你应该想出一个适用于 es5 的不同解决方案。

如果您的目标环境支持此 属性 但您还不信任所有功能的 es2015 实现,您可以只添加 Function 接口缺少 属性。在您的一个文件的顶层,您可以重新定义 Function 接口,这将合并到默认定义中,添加额外的 属性:

interface Function {
  /**
   * Returns the name of the function. Function names are read-only and can not be changed.
   */
  readonly name: string;
}