在以下示例中,TypeScript编译器不接受语句
this.iMember = new Two();
和
this.apply(this.member as T)
错误消息输入&#39;两个&#39;虽然在两种情况下 new Two()履行合同 extends IOne ,但不能分配给&#39; <&#39; 。有没有人知道为什么以及如何正确的代码应该是什么样的?
通过将示例粘贴到https://www.typescriptlang.org/play/
中可以重现问题示例:
interface IOne{
getOne(): string;
}
interface ITwo extends IOne
{
getTwo(): number;
}
class Two implements ITwo{
getOne(): string{
return "One";
}
getTwo(): number{
return 2;
}
}
class Usage<T extends IOne> {
iMember: T;
member: Two;
constructor(){
this.iMember = new Two();
this.member = new Two();
}
doApply() {
this.apply(this.iMember);
this.apply(this.member as T);
}
apply(obj: T)
{
let test = obj.getOne();
}
}
我尝试了与Java代码相同的示例。
interface IOne
{
String getOne();
}
interface ITwo extends IOne
{
int getTwo();
}
class Two implements ITwo
{
@Override
public String getOne()
{
return "One";
}
@Override
public int getTwo()
{
return 2;
}
}
class Usage<T extends IOne>
{
T iMember;
Two member;
Usage()
{
this.member = new Two();
}
void doApply()
{
this.apply( this.iMember );
this.apply( (T) this.member );
}
void apply( T obj )
{
String test = obj.getOne();
}
}
在这种情况下,它适用于显式转换为T. 在Typescript世界中,它仍会导致相同的错误消息。 实际的问题是为什么它在Java中是合法的而在Typescript 中是不合法的?