typescript - Medlem med generisk typ accepterar inte konkreta instanser
I följande exempel accepteras inte utsagorna av TypeScript-kompilatorn
this.iMember = new Two();
och
this.apply(this.member as T)
med felmeddelandet Typen 'Two' kan inte tilldelas typen 'T' även om i båda fallen new Two() uppfyller kontraktet extends IOne. Har någon någon idé varför och hur den korrekta koden borde se ut?
Problemet kan reproduceras genom att klistra in exemplet på https://www.typescriptlang.org/play/
Exempel:
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();
}
}
Jag provade samma exempel som Java-kod.
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();
}
}
I så fall fungerar det med explicit typomvandling till T. I Typescript-världen leder det fortfarande till samma felmeddelande. Den verkliga frågan är varför det är lagligt i Java men inte i Typescript?