为什么不';typescript中的t方法参数逆变

为什么不';typescript中的t方法参数逆变,typescript,Typescript,在Typescript中,允许在派生类中使用协变方法参数。 这看起来是对LSP的公然违反。 这篇语言设计的意图是什么,是故意的还是设计上的限制 接口A{ a:数字; } 接口B扩展了A{ b:数字; } 阶级基础{ 公共foo(arg0:A):B{ 返回{a:0,b:42}; } } 类派生的扩展基{ public foo(arg0:B):允许使用B{//协变参数,但不确定 返回{a:+arg0.a.toPrecision(2),b:+arg0.b.toPrecision(2)};//运行时错误

在Typescript中,允许在派生类中使用协变方法参数。
这看起来是对LSP的公然违反。
这篇语言设计的意图是什么,是故意的还是设计上的限制

接口A{
a:数字;
}
接口B扩展了A{
b:数字;
}
阶级基础{
公共foo(arg0:A):B{
返回{a:0,b:42};
}
}
类派生的扩展基{
public foo(arg0:B):允许使用B{//协变参数,但不确定
返回{a:+arg0.a.toPrecision(2),b:+arg0.b.toPrecision(2)};//运行时错误,b未定义,尽管应该是必需的
}
}
设b:Base=new-Derived();//将子类分配给基类应该始终是正常的
b、 foo({a:10});//不需要通过b级考试,对吗?

方法参数在typescript中表现为双变量。有一种方法可以让他们做出相反的行为,但由于它从2016年开始开放,它可能不是一个优先事项

有一个选项(
strictFunctionTypes
)可以使函数签名的参数的行为与方法的行为相反,但方法可以明确地免除更严格的检查。通过对函数引入这种更严格的模式,我们了解了方法豁免背后的原因:

方法被专门排除在外,以确保泛型类和接口(如数组)继续以协变方式关联。严格检查方法的影响将是一个更大的突破性变化,因为大量泛型类型将变得不变(即使如此,我们可能会继续探索这种更严格的模式)


B延伸A,这就是为什么它是好的。如果我理解这个问题correctly@John这就是为什么编译器允许它,但OP是对的,它确实打破了liskov:@John你可能想在你的帖子中添加这个:@kabanus这是一个很好的建议,太糟糕了,它从2016年就开始开放了。可能在不久的任何时候都看不到光明