ts中混合类型接口和类类型接口有所不同
ts的中文手册中,在混合接口这一节有一段概念让我当时没理解:
一个例子就是,一个对象可以同时做为函数和对象使用,并带有额外的属性。
给出的具体例子是:
// 混合类型接口 interface Counter { (start: number): string; // 函数 interval: number; // 对象属性 reset(): void; // 方法 } function getCounter(): Counter { let counter = <Counter>function (start: number) { }; counter.interval = 123; counter.reset = function () { }; return counter; } let c = getCounter(); c(10); c.reset(); c.interval = 5.0;
在Counter接口中给出了一个函数(没有函数名)和两个对象属性,按照示例的方法声明后可以同时以函数或对象调用的方式调用Counter接口实例。
这个接口无法像之前的接口那样通过以下形式声明:
let t: someInterfact = { ... }
在JavaScript中,Function的原型是Object,因此可以赋对象属性值到Function实例上,这确实是合法的,JavaScript中一切皆对象。
但是要把混合类型接口和类类型接口作比较:
// 类类型接口 interface someClass { someFunc(p1: number): void; // 方法 param: number; // 对象属性 } let t: someClass = { someFunc: function(p) { console.log(p); }, param: 10 } t.someFunc(t.param);
类类型接口其实可以看似成函数接口+对象接口,不过这个函数接口是有名字的方法(而不是函数),函数接口里可以没有方法。
不过这些都是概念上的问题,总之突出一个特点:JavaScript非常灵活,非常随意(坑)。

浙公网安备 33010602011771号