Typescript类增强器和静态方法

问题描述 投票:1回答:1

对于NextJS应用程序,我想创建一个App(_app.tsx)类增强器,但我无法让它调用传递的基础应用程序类的静态方法。

interface Constructor<T> {
  new (...args: any[]): T;
  prototype: T;
}

class MockNextApp<P={}>{
    props: P;
    static getInitialProps = (ctx: {}) => {foo:"bar"}

    constructor(props: P) {
        this.props = props;
    }
}

function enhanceApp<T extends Constructor<MockNextApp>>(Base: T) {
    return class extends Base{
        static getInitialProps = (ctx: {}) => {
            return Base.getInitialProps();
        }
    }
}

打字稿错误:

Property 'getInitialProps' does not exist on type 'T'.

您可以查看示例here

typescript next.js
1个回答
1
投票

使用Constructor意味着这将是一个返回MockNextApp的构造函数,但是这并没有说明Base应该具有的任何其他静态属性。

我们可以使用一个内联类型,它包含构造函数签名和函数中所需的额外静态属性:

class MockNextApp<P={}>{
    props: P;
    static getInitialProps = (ctx: {}) => ({foo:"bar"}) // I think you mean to return an object literal, without the (), the arrow function actually returns void.

    constructor(props: P) {
        this.props = props;
    }
}

function enhanceApp<T extends {
    new(...args: any[]): MockNextApp;
    getInitialProps(): { foo: string }
}>(Base: T) {
    return class extends Base{
        static getInitialProps = (ctx: {}) => {
            return Base.getInitialProps();
        }
    }
}
热门问题
推荐问题
最新问题