【问题标题】:extending a generic class with typed method使用类型化方法扩展泛型类
【发布时间】:2021-12-30 15:51:28
【问题描述】:

我尝试在派生类中自动键入一个被覆盖的方法以避免重复自己。

class A<T> {
  foo (bar: T) {
    return bar
  }
}

class B extends A<number> {
  // Error: bar is any instead of number
  foo (bar) {
    console.log(bar)
    return bar
  }
}

TS Playground

我不明白为什么上面的代码不能正常工作。这里有什么问题?有解决办法吗?

// 编辑:

问题是,“我必须改变什么才能让它发挥作用”。我不想在函数定义中编写类型,因为我有多个带有多个参数的函数。我不想重复自己。作为奖励,我想了解它在后台是如何工作的,以及为什么它不像我那样工作

【问题讨论】:

  • 这样做的全部原因是为了避免再次输入所有内容。在我的实际应用程序中,泛型要复杂得多,并且有多种方法使用它。我不想重复自己:/
  • 如果他们需要匹配,它应该只会在我指定错误类型时抱怨,否则假设来自基类的那些不应该吗?
  • @blurfus 问题是“为什么 TS 不能推断 number 参数”,而不是“如何停止 any 的 TS 错误”。
  • 这里的主要问题是什么?是“为什么它不起作用/问题是什么”(答案涉及github.com/microsoft/TypeScript/issues/1373github.com/microsoft/TypeScript/issues/23911)还是“有解决方案”可能需要各种解决方法建议?
  • @jcalz 这些链接非常有用。谢谢!

标签: typescript typescript-generics


【解决方案1】:

编辑:在考虑your comment更多之后:

这样做的全部原因是为了避免再次键入所有内容。在我的实际应用程序中,泛型要复杂得多,并且有多种方法使用它。我不想重复自己:/

我想我现在明白问题的核心更多是关于减少打字而不是其他任何事情。答案是使用type alias

TS Playground

interface Person { name: string }

enum RelationshipType {
  Parent,
  Sibling,
  Colleague,
  // ...etc.
}

interface Associate { relationship: RelationshipType }
// ... more interface types

type Complicated = Person & Associate /* & ...etc. */;

class B extends A<Complicated> {
  foo (bar: Complicated) {
    console.log(bar);
    return bar;
  }
}

const b = new B();
b.foo({
  name: 'Daddy Elon',
  relationship: RelationshipType.Parent,
}); // Complicated

你真的需要重写这个方法吗?如果没有,您只需要在提供泛型类型的同时扩展基类:

TS Playground

class A<T> {
  foo (bar: T) {
    return bar;
  }
}

class B extends A<number> {}

const b = new B();
const result = b.foo(42); // number
console.log(result); // 42

【讨论】:

  • 是的。我需要覆盖它。它基本上是一个具有给定类型的抽象方法。
  • 不,问题是,“我必须改变什么才能让它工作”。我不想在函数定义中写一个类型,因为我有多个带有多个参数的函数。我不想重复自己。作为奖励,我想了解它在保持状态下是如何工作的,以及为什么它不像我那样工作
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多