Typescript:在调用 super 之前从基类构造函数访问继承类的静态属性?

Kat*_*tie 5 node.js typescript

我有一个抽象错误类用于继承服务错误,以使错误处理更容易一些。(ErrorBase来自https://gist.github.com/justmoon/15511f92e5216fa2624b#gistcomment-1928632

export abstract class ServiceError extends ErrorBase {
  abstract statusCode(): number;
  abstract readonly errorCode: string;
  static readonly defaultMessage: string;
  constructor(readonly context?: any, message?: string) { super(message); }

  toJSON(key: any) {
    return {
      errorCode: this.errorCode,
      message: this.message,
      context: this.context
    };
  }    
}
Run Code Online (Sandbox Code Playgroud)

这是扩展它的类的示例:

export class ExampleError extends ServiceError {
  statusCode(): number { return 400; }
  errorCode: string = "err-example";
  static readonly defaultMessage = "This is an example error";
  constructor(context?: any, message?: string) {
    super(context, message ? message : ExampleError.defaultMessage);
  }
}
Run Code Online (Sandbox Code Playgroud)

我一直在试图找出一种从基类的构造函数内部访问继承类的 defaultMessage 的方法,以便我可以简化继承类的构造函数。我有什么办法可以做到这一点吗?

Gre*_*ycz 4

静态属性只是在原型函数上定义的属性。他们像这样编译:

// TypeScript
class A {
    public static property = 'my string';
}

// Compiled ES5 JavaScript
function A() {}
A.property = 'my string';
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用 constructor on 属性this来访问用于构造实例(或更确切地说是复制)的派生类/函数:

class A {
    public static defaultMessage = 'My Error A';
    constructor() {
        // will output "My Error B" if a instance of B is being constructed
        console.log(this.constructor['defaultMessage']);
    }
}

class B {
    public static defaultMessage = 'My Error B';
}
Run Code Online (Sandbox Code Playgroud)

  • 在调用“super”之前不能访问“this” (2认同)