在Typescript中,什么是数组作为函数名?

时间:2016-09-22 22:22:59

标签: typescript

以下代码由ts-node正确编译和执行。

class C {
    ["abc"]() {
        return "C";
    }
}

let c = new C();

let className = c["abc"]();
console.log(className);

但是我不理解以下类属性。

["abc"]() {}

我认为它涉及计算属性的概念,但我不理解这种语法。

问题1:

[“abc”]是一个在索引0处有一个字符串元素的数组。如果你在它周围添加一个函数定义,那么[“abc”](){},那么它是什么呢?你怎么能使用数组作为函数名?

问题2:

为什么不通过以下方式调用成员方法?

c.["abc"](); 

2 个答案:

答案 0 :(得分:1)

就像foo['bar']foo.bar是访问对象成员的等效方法一样,您可以在object initializers中使用['bar']的索引器语法和类定义。

对于您的示例,在编译时静态地知道该属性,这并没有真正为您提供任何优势,因为它直接等同于以下内容:

class C {
    abc() {
        return "C";
    }
}

但是,索引器语法确实允许您执行一些其他方式无法实现的功能。

例如,您可以使用非有效标识符的成员名称,例如以数字开头的名称,或者里面有破折号:

class C {
    ['123foo']() { … }
    ['foo-bar']() { … }
}

它还允许您通过从变量中获取成员名称来动态指定成员名称:

let memberName = 'foo';
class C {
    [memberName]() { return 'bar'; }
}
console.log(new C().foo()); // bar

这也用于JavaScript中的Symbols,它提供了一种在对象上定义成员的方法,这些对象不是自由可见的,但只能通过直接访问同一个符号对象来访问。这将最终允许新的高级功能,如Symbol.iterator用于迭代自定义类型。

答案 1 :(得分:0)

  

为什么不通过以下方式调用成员方法

是推荐的。但是如果你想通过配置来供电某些东西(不是静态的),例如来自服务器的字符串,您可以使用索引器语法。