【问题标题】:What does the keyword "new" mean in an interface?界面中的关键字“new”是什么意思?
【发布时间】:2017-08-02 23:09:45
【问题描述】:

我正在浏览 typescript 的文档并找到了一个示例

interface ClockConstructor {
    new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
    tick();
}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {
    return new ctor(hour, minute);
}

class DigitalClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("beep beep");
    }
}
class AnalogClock implements ClockInterface {
    constructor(h: number, m: number) { }
    tick() {
        console.log("tick tock");
    }
}

let digital = createClock(DigitalClock, 12, 17);
let analog = createClock(AnalogClock, 7, 32);

我了解了接口的所有概念,但我坚持在接口中使用 new 关键字和匿名对象声明

 interface ClockConstructor {
        new (hour: number, minute: number): ClockInterface;
    }

我不知道它背后的目的是什么以及它是如何工作的?我在https://www.typescriptlang.org/docs/handbook/interfaces.html找到它

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 声明本身并没有任何“匿名”。你能澄清一下你的意思吗?
  • 我想问的是,这条线是什么意思——新的(小时:数字,分钟:数字):ClockInterface;
  • 表示new Clock(0,0)函数调用有效,假设Clock兼容ClockConstructor接口。

标签: typescript


【解决方案1】:

它声明这个接口的对象是构造函数,并且可以使用new关键字调用。

【讨论】:

  • 如何创建接口对象 - 它声明“此接口的对象”是构造函数,可以使用 new 关键字调用。
  • typescript 中的接口只是对对象“形状”的描述。您不必在任何地方明确提及您正在实例化与接口兼容的东西。
  • 我明白了。但这是如何工作的?看看 createClock 方法的第一行,这个方法接受第一个参数作为“ClockConstructor”的类型,但是我们传递了一个完整的类“DigitalClock”,它实现了“ClockInterface”接口,所以“DigitalClock”类肯定不是“ClockConstructor”的类型”。但仍然 createClock 方法接受它。我真的不知道为什么以及如何? OOPS 永远不会像这样工作。
  • 不,这是正确的。 TypeScript 中的 class 关键字是构造函数的简写,其成员分配给所述函数的原型。 DigitalClock 属于 ClockConstructor 类型,并且ClockInterface 兼容:您不能直接调用 DigitalClock.tick(),只能在类的实例上调用。但是(new DigitalClock()).tick() 是有效的,因此DigitalClock 的实例与ClockInterface 兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2011-02-14
  • 2010-10-29
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多