在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
是实际类型而不是类型参数。
有关如何降低类型参数下限的想法吗?
答案 0 :(得分:1)
两个问题。第一个是实用的:
我不认为这是一个概念上有意义的限制。这听起来像是参数逆变的变种。您所说的是,您愿意接受任何类型Kitten
的超类。
问题是以下情况也适用:
Kitten
是Cat
。Cat
是Animal
。到目前为止,我们还不错。但是还要考虑以下几点:
class
一样,Animal
是Object
的子类,它是全局根类型。 Object
。因此,A
必须是Kitten
的超类的限制实际上意味着A
只能被假定为Object
,这意味着类型约束毫无意义因为所有类型都满足这个要求。
另一个问题是这违反了Liskov Substitution Principle,它声明任何对于类T
成立的属性也应该对其子类成立。因此,放置一个接受类Cat
但不接受其子类Kitten
的对象的约束会违反该规则。
答案 1 :(得分:0)
TypeScript尚不支持泛型的下限。目前正在讨论这种建议-TypeScript开发人员不确定是否需要这种功能。因此,我们只能等待并希望他们会同意实施。
在TypeScript问题跟踪器中查看问题-https://github.com/Microsoft/TypeScript/issues/14520