如何在TypeScript中设置下限到类型参数?

时间:2017-03-07 20:19:38

标签: generics typescript types type-bounds

在TypeScript(我的版本:2.1.1)中,可以设置一个上限来键入这样的参数:

A

如何设置class Animal {} class Cat extends Animal {} class Kitten extends Cat{} function foo<A super Kitten>(a: A) { /* */ } 的下限?以下代码不起作用:

function foo <X extends Y, Y>(y: Y) { /* */ }

这将导致编译错误。

TypeScript repo的GitHub问题#13337中的人建议使用

Y

X的下限X。但这并不包括我的情况,其中As New是实际类型而不是类型参数。

有关如何降低类型参数下限的想法吗?

2 个答案:

答案 0 :(得分:1)

两个问题。第一个是实用的:

约束无效

我不认为这是一个概念上有意义的限制。这听起来像是参数逆变的变种。您所说的是,您愿意接受任何类型Kitten的超类。

问题是以下情况也适用:

  • KittenCat
  • 的子类
  • CatAnimal
  • 的子类

到目前为止,我们还不错。但是还要考虑以下几点:

  • 与任何TypeScript class一样,AnimalObject的子类,它是全局根类型。
  • 所有内容都被视为TypeScript Object

因此,A必须是Kitten的超类的限制实际上意味着A只能被假定为Object,这意味着类型约束毫无意义因为所有类型都满足这个要求。

违反Liskov替代原则

另一个问题是这违反了Liskov Substitution Principle,它声明任何对于类T成立的属性也应该对其子类成立。因此,放置一个接受类Cat但不接受其子类Kitten的对象的约束会违反该规则。

答案 1 :(得分:0)

TypeScript尚不支持泛型的下限。目前正在讨论这种建议-TypeScript开发人员不确定是否需要这种功能。因此,我们只能等待并希望他们会同意实施。

在TypeScript问题跟踪器中查看问题-https://github.com/Microsoft/TypeScript/issues/14520