TypeScript中省略键名冒号的合法性及对象后[name]的含义
问题解答
1. 为什么TypeScript允许省略动态键后的冒号?
这不是TypeScript专属的特殊规则,ES6(ES2015)之后的标准JavaScript就已经支持动态属性名的方法简写语法。
在对象中定义方法时,不管属性名是静态固定的还是动态计算的,都可以用简写形式:
- 静态键的简写:
{ fn() {} }和{ fn: function() {} }完全等价 - 动态键的简写:
{ [key]() {} }等价于{ [key]: function() {} }
你给出的TS代码里,[name](...args: any[]) { ... }就是动态键的方法简写,本质和你第一个JS例子里的[key]: ()=>{...}逻辑一致,只是把箭头函数换成了普通函数的简写形式,所以可以省略冒号,这是JS/TS通用的标准语法,并非TS额外新增的特性。
2. 对象闭合大括号后的[name]是什么含义?
这段代码先创建了一个临时对象,这个对象里只有一个属性:属性名是name变量的具体值,属性值就是我们定义的那个函数。
而[name]是属性访问操作,意思是从这个临时对象里,取出属性名与name变量值完全匹配的那个属性(也就是刚定义的函数),最终把这个函数作为nameFunction的返回值。
举个实际调用的例子:如果执行nameFunction('sayHi', () => console.log('hi')),临时对象会是{ sayHi: function(...args) { return body(...args) } },[name]就会取出这个对象的sayHi属性(也就是目标函数)并返回。这么做的核心目的是让返回函数的name属性等于传入的name参数(直接定义的函数name是自身标识符,而通过动态属性绑定的函数,name会被设置为对应的属性名)。
内容的提问来源于stack exchange,提问作者Jakub Kutrzeba
相关产品推荐
相关产品推荐

