typescript - 在 typescript 中继承静态方法

标签 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'.

我知道一种解决方案是简单地将创建函数重命名为 createA 和 createB,但感觉不对。

最佳答案

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

看看 Playground 上生成的 typescript ,你就会明白它的含义: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 使这项工作有效,但它没有达到我的预期。

关于typescript - 在 typescript 中继承静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46619882/

相关文章:

javascript - JS/TS判断一个JSON对象是否实现类或接口(interface)

node.js - 我在 nestjs 项目中运行 dist 文件时出错,请帮助我

javascript - 捕获多个异步错误

javascript - 在下一个页面 reactjs 中搜索结果

types - 用户定义的类型防护不适用于 `any` 类型?

javascript - Angular 2 typescript 调用javascript函数

angular - 如何为输入字段提供 2 路格式化程序?

visual-studio - Visual Studio Online Build 在 TypeScript 上失败

javascript - 模板文字类型等效

javascript - 如何使用 Angular 8 在互联网重新连接时重新发送失败的 API 请求?