在typescript中继承静态方法

时间:2017-10-07 12:00:56

标签: typescript

我正在生成使用继承的TypeScript类。每个类都使用静态创建函数,它可能不同。

class A {
  static create(arg: string): A {
    // use args to create A
    return new A()
  };
} 

class B extends A {
  static create(argsForB: number): B {
    // use argsForB to create B
    return new B()
  };
}

由于无论如何都不应继承静态函数,因此该错误没有任何意义:

Class static side 'typeof B' incorrectly extends base class static side 'typeof A'.
  Types of property 'create' are incompatible.
    Type '(argsForB: number) => B' is not assignable to type '(arg: string) => A'.
      Types of parameters 'argsForB' and 'arg' are incompatible.
        Type 'string' is not assignable to type 'number'.

我知道一个解决方案就是将create-funtion重命名为createA和createB,但感觉不对。

1 个答案:

答案 0 :(得分:0)

请记住,Typescript主要是最近ECMAscript规则的超集。一般来说,Javascript没有类型,因此Typescript阻止您创建一个类,它认为Javascript无法识别您要调用的版本。从TS角度来看,它不能强制执行一个版本或另一个版本,因为这两个版本的生成代码相同。还要注意,这与静态方法无关。如果删除静态限定符,则会在第二个类的create方法上出现错误,并显示类似的消息。

看看在Playground上生成的打字稿,您会发现它的含义:Typescript Playground example

在这种情况下,我仍然不太了解您打算做什么,但是这样做可能会解决问题,尽管可能无法解决您要解决的问题:

class A {
  static create(arg: string | number): A {
    // use args to create A
    return new A()
  };
} 

class B extends A {
  static create(argsForB: string | number): B {
    // use argsForB to create B
    return new B()
  };
}

有许多在Javascript中可以正常工作的构造,Typescript会将其称为错误,因为它们的工作方式不允许强制执行类型规则。

请考虑以下内容:

class A {
  content: string;
  static create(arg: string): A {
    // use args to create A
    let result = new A();
    result.content = arg;
    return new A()
  };
} 

class B extends A {
  content: number;
  static create(argsForB: number): B {
    // use argsForB to create B
    let result = new B();
    result.content = argsForB;
    return result;
  };
  sendMessage
}

let testB = B.create(5);
alert(testB.content);
let testCastA = testB as A;
alert(testCastA.content);

像以前一样,生成的Javascript可以完成这项工作,但它没有达到我的期望。