【问题标题】:Use Inheritance to Add More Restrictions on The Method Input使用继承对方法输入添加更多限制
【发布时间】:2022-01-18 20:51:42
【问题描述】:

作为标题。我是 TS 的新手,正在学习它。我将提供一个例子来描述我被卡住的地方。下面代码的错误是:

Type 'undefined' is not assignable to type 'number'.

所以 TS 没有上下文知识:它不知道 NumberQueue 的 push 会限制可以进入队列的内容。

// 11. Generics
// 
class Queue {
  private data = [];
  push(item) { this.data.push(item); }
  pop() { return this.data.shift(); }
}
class NumberQueue extends Queue {
  push(item: number) { super.push(item); }
  pop2(): number { return super.pop(); }  // I'm concerning the TS Error (as above) on this line.
}

如何更改代码以绕过此错误?鉴于我(假设是)比 TS 知识渊博。另一个小问题是是否可以将pop2 更改为pop 而不会出现TS 错误?

【问题讨论】:

  • 您说您的pop2 方法返回了number,但您实际上返回了Array.prototype.shift 的结果,即undefined,因为调用了Array<never>
  • 我会使用泛型;将其更改为 Queue<T>,以及 data: T[]push(item: T)pop(): T。然后NumberQueue 可以扩展Queue<number>。我不确定为什么pop 在基类中转移并在后代中弹出。看起来很奇怪。
  • @GuerricP:虽然我也写过push(...) 现在接受number 类型的一个。

标签: typescript typescript-typings


【解决方案1】:

您可以使用generics 并像这样修复方法和data 类型:

class Queue<T> {
  private data: T[] = [];
  push(item: T) { this.data.push(item); }
  pop(): T | undefined { return this.data.shift(); }
}

class NumberQueue extends Queue<number> {
  push(item: number) { super.push(item); }
  pop2(): number | undefined { return super.pop(); } 
}

TypeScript playground

【讨论】:

  • 感谢您的回答。虽然我实际上正在观看介绍泛型的教程。但我仍然对没有泛型感兴趣(对不起,我没有在我的 OP 中提到这一点),问题将如何解决?
  • 如果没有泛型,您仍然必须输入Queue,否则data 被视为Array&lt;never&gt;,因此您必须将所有内容都输入为number。如果您需要一个泛型类,请不要尝试不输入它,只需使用generics 这就是他们的全部目的
  • 那么根据你的解释,我会考虑使用继承,甚至不考虑我标题中问题的解决方案。
  • 确实,一个泛型类就足够了,除非你想在上面添加其他方法,但如果你只想输入pop,那么你不需要扩展它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2013-07-17
  • 2016-05-31
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多