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

Generics 如何在TypeScript中设置类型参数的下限?,generics,typescript,types,type-bounds,Generics,Typescript,Types,Type Bounds,在TypeScript(我的版本:2.1.1)中,可以设置如下类型参数的上限: 类动物{} 类Cat扩展了动物{} 类Kitten扩展了Cat{} 类型脚本repo的函数foo建议使用 函数foo(y:y){/**/} 使用X设置下限Y。但这不包括我的情况,在这种情况下,X是一个实际类型,而不是一个类型参数 关于如何降低类型参数的下限有什么想法吗?两个问题。第一个是实用的: 约束是没有效果的 我不认为这是一个概念上有意义的限制。这听起来像是参数逆变的变体。你的意思是你愿意接受任何属于Kitte

在TypeScript(我的版本:2.1.1)中,可以设置如下类型参数的上限:

类动物{}
类Cat扩展了动物{}
类Kitten扩展了Cat{}
类型脚本repo的函数foo建议使用

函数foo(y:y){/**/}
使用
X
设置下限
Y
。但这不包括我的情况,在这种情况下,
X
是一个实际类型,而不是一个类型参数


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

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

约束是没有效果的 我不认为这是一个概念上有意义的限制。这听起来像是参数逆变的变体。你的意思是你愿意接受任何属于
Kitten
超类的类型

问题是以下情况也适用:

  • Kitten
    Cat
    的一个子类
  • Cat
    Animal
    的一个子类
到目前为止我们还不错。但同时也要考虑以下几点:

  • 像任何类型脚本
    动物
    是全局根类型
    对象
    的子类
  • 一切都被认为是一个类型脚本
    对象
因此,
a
必须是
Kitten
的超类的限制实际上意味着
a
只能被假定为
对象
,这意味着类型约束没有意义,因为所有类型都会满足该要求

违反了Liskov替代原则
另一个问题是,这违反了,即对于类
T
为true的任何属性对于其子类也应为true。因此,放置一个约束将接受类
Cat
但不接受其子类
Kitten
的对象将违反该规则。

TypeScript还不支持泛型的下限。这样的建议目前正在讨论中-TypeScript开发人员不确定这样的功能是否必要。因此,我们只能等待并希望,他们将同意实施该计划


请参见此处TypeScript issue tracker中的问题-

为什么需要这样做?如果
是一只超级小猫
,那么
A
显然是一只
小猫
、一只
和一只
动物
,你如何从缩小范围中获益?你能给出一个如何使用它的真实例子吗?因为你使用了类似Java的语法,我想你的问题的灵感来自Java的相反性。事实上,Java只允许在通配符(例如,
comparables)中使用逆变。我认为您的答案是错误的,因为下限在Java中使用了数年。我认为FstTesla在对问题的评论中的回答是,我缺少什么吗?请参阅我在回答这个问题时提供的链接。有很多讨论。