【问题标题】:How to extend an interface with object resulting in new interface with object props merged into interface prototype?如何使用对象扩展接口,从而将对象道具合并到接口原型中的新接口?
【发布时间】:2017-10-09 19:00:14
【问题描述】:

这样做的目的是在旧代码库上获得良好的智能感知,我不能只将其转化为 ES6 语法。我有:

extend<T, K>(cls: T, xtn: K): T & K

----用法:

var NewClass = extend(MyClass /* just a function */, {
  init() {

  }
})

我预计NewClass 的原型中会有init,但不是。

问题是如何通知 Typescript 合并到原型中?

【问题讨论】:

    标签: typescript visual-studio-code typescript-typings


    【解决方案1】:

    您确实可以这样做,但您需要指定与xtn 对象相交的值的类型是实例化结果值的构造函数。

    因此,extend 的签名应该是这样的

    function extend<T, K>(cls: new (...args: {}[]) => T, xtn: K): new (...args: {}[]) => T & K;
    

    如果不知道 MyClass 是可构造的,TypeScript 仍然会出错。

    我们可以重载extend来解决这个问题

    function extend<T, K>(cls: (...args: {}[]) => T, xtn: K): new (...args: {}[]) => T & K;
    function extend<T, K>(cls: new (...args: {}[]) => T, xtn: K): new (...args: {}[]) => T & K;
    

    【讨论】:

    • 如何将上下文带到新类中。 this. ?有可能吗?
    • 我不确定你的意思。您是在谈论静态成员或超类访问还是其他不同的东西?
    • somethingMyClass 实例的成员吗?您可以在init 中指定this 的类型,但无法推断。所以如果MyClass创建了一个具有something属性的值,你可以写init(this: T) { alert(this.something); }
    • 我的目标是疯狂的动态,但这似乎还不可能,就像你说的那样,没有办法在扩展道具中推断它。感谢您对扩展的帮助,这已经足够了:)
    • 是的,但是在这里尝试解释是不明智的,所以这里链接github.com/Microsoft/TypeScript/issues/15836
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    相关资源
    最近更新 更多