打字稿:如何在没有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-ES2015 不是一个选项。
问题在于此代码仅适用于较新版本的 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;
}
我在 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
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-ES2015 不是一个选项。
问题在于此代码仅适用于较新版本的 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;
}