typescript 扩展具有相同名称和不相关类型的基类方法

6tqwzwtp  于 2023-08-07  发布在  TypeScript
关注(0)|答案(1)|浏览(118)

一个非常简单的要求,但我找不到解决方案。我实现了一个class B,它继承了class A并覆盖了class A的一个方法,但使用了不同的类型。方法名 * 必须 * 相同。

class A {
  method(): string {
    return "1";
  }
}

class B extends A {
// TS2416: Property 'method' in type 'B' is not assignable to the same property in base type 'A'.   Type '() => number' is not assignable to type '() => string'.     Type 'number' is not assignable to type 'string'.
// v
  method(): number {
    return 1;
  }
}

字符串
this post(大约5年前)解释了typescript继承实现子类型化,因此从具有同名方法的类继承的类上的方法必须是原始方法的子类型。但是,我确实需要这个选项,而且我想以一种可靠方式抑制这些 typescript 错误。
这在 typescript 中可能吗(另一种方式,而不是到处都是'ts-ignore')?

57hvy0tb

57hvy0tb1#

B * 必须 * 可分配给A,否则您的继承无效。
你在这里打破了继承的一个原则,即子类支持它的超类的接口。
如果子类是它的父类,那么你应该总是能够使用它。如果你违反了这个规则,那就是类型错误。
所以这是一个合法的类型错误,你试图做的是不合理的。
为了使B可分配给A,那么A.method()的返回类型可以更改为返回string | number

class A {
  method(): string | number { // added "| number" here
    return "1";
  }
}

class B extends A {
  method(): number { // fine
    return 1;
  }
}

字符串
参见Playground

相关问题