首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在typescript中继承静态方法

在typescript中继承静态方法
EN

Stack Overflow用户
提问于 2017-10-07 20:00:56
回答 1查看 2.5K关注 0票数 6

我正在生成使用继承的TypeScript类。每个类都使用一个静态的create-function,这可能是不同的。

代码语言:javascript
复制
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()
  };
}

因为静态函数无论如何都不应该被继承,所以这个错误没有任何意义:

代码语言:javascript
复制
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,但感觉并不正确。

EN

回答 1

Stack Overflow用户

发布于 2018-10-05 03:36:17

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

看看游乐场上生成的打字脚本,你就会明白它的含义了:Typescript Playground example

我仍然不太理解你在这种情况下的目标是什么,但这样做会解决这个问题,尽管可能不会解决你想要完成的事情:

代码语言:javascript
复制
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将其称为错误,因为它们的工作方式不允许强制执行类型规则。

请考虑以下几点:

代码语言:javascript
复制
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会生成,使其工作,但它不会做我所期望的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46619882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档