Pomoc w przepisaniu Java na TypeScript (generyki)

0

Cześć,
Próbuję zaimplementować sobie w Typescript asynchroniczne RPC oparte o Websockety. Chcę mieć możliwość ustalania "protokołu" czyli pary klas żądanie - odpowiedź, i narzucić kompilatorowi pilnowanie typów takich par przy wysyłaniu żądania. Udało mi się to zakodzić w Javie, ale w Typescript mam problem.

W Javie wygląda to tak:


abstract class Request<T extends  Response>{
    int id;
}
abstract class Response{
    int id;
}

class GetRoomList extends Request<RoomList>{
}
class RoomList extends Response {
    String roomList;
}

public class Program { 
    
    <Req extends Request<Resp>, Resp extends Response>
    void call( Req request, Consumer<Resp> listener ){
        // (...)
    }
    
    public static void main(String[] args) {
        new Program().call( 
                new GetRoomList(), 
                (rl)-> System.out.println( rl.roomList )
        );
    }
    
}

I jest tak jak tego oczekuję- Java domyśla się że argumentem listenera w metodzie "call" jest typ RoomList. Właśnie z tym w Typescript mam problem, wygląda to tak:


abstract class Request<T extends  Response>{
    id: number;
}
abstract class Response{
    id: number;
}


class RoomList extends Response {
    roomList: string;
}
class GetRoomList extends Request<RoomList>{
}

class Program { 
    
    call
    <Req extends Request<Resp>, Resp extends Response>
    ( request: Req, listener: (r: Resp)=>void ): void {
        // (...)
    }
    
    main( args: string[] ) {
        new Program().call( 
                new GetRoomList(), 
                (rl) => console.log( rl.roomList )
        );
    }
    
}

ale Typescript w miejscu (rl) => console.log(rl.roomList) krzyczy że "[ts] Property 'roomList' does not exist on type 'Response'."

Pls halp

2

Wydaje mi się, że TS nie wspiera takiej składni (podobny problem: https://github.com/Microsoft/TypeScript/issues/18305) - musisz być explicit: (rl: RoomList) => console.log( rl.roomList ).

2

TypeScript nie potrafi w inferencję typów przy generykach. W ogóle i out of box -> https://github.com/Microsoft/TypeScript/issues/5884 poprawiono to podobno w wersji 3.1 https://stackoverflow.com/questions/38687965/typescript-generics-argument-type-inference/38688143#38688143 ale musisz czekać.

0

Łe, trochę się zawiodłem, no ale trudno. Dzięki za odpowiedzi @Patryk27 i @Koziołek

1 użytkowników online, w tym zalogowanych: 0, gości: 1