为包装类添加TypeScript定义

时间:2017-06-08 21:59:57

标签: reactjs typescript types react-server

我正在使用名为react-server的程序包,该程序包可以使用任何类,并在运行时向其添加方法。它希望它包含的类具有类似

的接口
interface {
    getElements(): Array<React.Component>
}

它将向类添加方法,如getRequest(),也可以从类内部引用。

想象一下像以下一样的页面类:

class SimplePage {
  getElements() {
    // Right now, this wouldn't compile, because this.getRequest() is
    // not an available method.
    const request: Request = this.getRequest();
    // ...
  }
}

鉴于this.getRequest()在编译时实际上并不存在,并且react-server实际上没有提供我可以从我的定义文件中引用的任何实际类或接口,有什么方法可以创建一个我可以使用的定义,这个定义实际上是一个Page类型,并且可以使用这些方法吗?

理想情况下,我希望能够在某个定义文件(.d.ts)中提供这些内容,以便我可以在使用react-server的任何应用中引用它们。我也很乐意这样做,而不是每次我想引用这个方法时都被迫将this投射到别的东西上。

1 个答案:

答案 0 :(得分:1)

您可以考虑两个选项 给出以下界面:

interface ExtendedPage {
    getRequest(): Request;
}

(1)this parameter

class SimplePage {
    getElements(this: SimplePage & ExtendedPage) {
        const request: Request = this.getRequest();
        // ...
    }
}

(2)使用替换属性(like with mixins)实现接口:

class SimplePage implements ExtendedPage {
    getElements() {
        const request: Request = this.getRequest();
        // ...
    }

    getRequest: () => Request;
}

修改

您可以声明一个类并对其进行扩展:

declare class ExtendedPage {
    getRequest(): Request;
}

class SimplePage extends ExtendedPage {
    ...
}