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非常灵活,非常随意(坑)。

posted @ 2022-04-19 20:10  晚安NN  阅读(680)  评论(0)    收藏  举报