如何获取TypeScript命名空间内函数的自身名称?
解决TypeScript命名空间内函数获取自身名称的问题
你遇到的核心问题有两个:一是命名空间内的箭头函数无法正确获取name属性(返回空字符串),二是无法自动得到包含命名空间的完整函数名(比如NS.func)。以下是几种实用的解决办法:
1. 用具名函数表达式替代箭头函数
箭头函数的name属性依赖于赋值目标的变量名,但直接赋值给命名空间对象的属性时,无法正确推导名称。改用具名函数表达式可以让函数拥有明确的name,再手动拼接命名空间名称即可:
const func = () => { return func.name; } namespace NS { // 具名函数表达式,函数自身有明确的name值 export const func = function func() { return `NS.${func.name}`; } } console.log(func()); // 'func' console.log(NS.func()); // 'NS.func'
2. 使用函数声明定义命名空间内的函数
在命名空间内直接用函数声明,函数的name属性会自动被设置为函数名,同样手动拼接命名空间名称:
const func = () => { return func.name; } namespace NS { export function func() { return `NS.${func.name}`; } } console.log(func()); // 'func' console.log(NS.func()); // 'NS.func'
3. 避免硬编码命名空间名称(可选优化)
如果不想在代码里硬写命名空间的名字,可以提前将命名空间名称存储起来,再关联到命名空间对象:
const func = () => { return func.name; } const nsName = "NS"; namespace NS { export const func = function func() { return `${nsName}.${func.name}`; } } // 可选:给命名空间对象添加name属性,方便后续复用 (NS as Record<string, any>).name = nsName; console.log(func()); // 'func' console.log(NS.func()); // 'NS.func'
补充说明
- 箭头函数本身没有
name属性的自动推导能力,只有当它赋值给一个变量时,才会从变量名获取name;但赋值给对象属性时,这个推导规则不生效,所以会返回空字符串。 - 运行时无法自动获取TypeScript命名空间的原始名称,因为编译后它只是一个普通的JavaScript对象,没有内置的名称标识,所以完整的限定名里的命名空间部分只能手动指定或提前存储。
内容的提问来源于stack exchange,提问作者user23457110
相关产品推荐
相关产品推荐

