2017-09-08 46 views
1

我发现下面的示例中的Function.name documentation打字稿:如何让函数名作为字符串,不TS2339错误

const o = { 
    foo(){} 
}; 
o.foo.name; // "foo"; 

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

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

是当我想要检索 o.foo.name,在那里我将得到一个错误

TS2339(属性“名称”不存在)

我该如何处理它,保持对象输入? 我想避免必须投入属性“foo”,如(<any>o.foo).name

PS:用例是为了进一步重构而保留键入。例如,下面是安全的进行重构:

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

虽然这个人是不是

spyOn(o, "foo") 

PS 2:看来检索功能名称可能是有问题的TS:Get name of function in typescript

+0

你的代码在最新的打字稿精细,是你张贴完整的代码?也许还有一些其他问题?或者您是否使用以前版本的TS –

+0

@ TitianCernicova-Dragomir typescript 2.3.3,但在tsconfig.json中使用“target”:“es5”,这可能是属性名称被视为缺失的原因。 –

回答

1

问题是这段代码只适用于较新版本的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; 
} 
+0

我将es5定位到tsconfig.json中......谢谢 –

2

邮政ES2015,这个:

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

应该工作得很好。

检查它在Typescript Playground,并观察产生的JavaScript。您将看到您提到的foo示例的常见部分。

这里是控制台,非常干净:

enter image description here


预ES2015,这是行不通的,我想你会投它,如果目标后ES2015是不是一种选择。