Pomoc w przepisaniu Java na TypeScript (generyki)

Odpowiedz Nowy wątek
2018-07-26 12:01
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

edytowany 2x, ostatnio: student pro, 2018-07-26 12:03

Pozostało 580 znaków

2018-07-26 12:21

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 ).


Pozostało 580 znaków

2018-07-26 13:59
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/que[...]e-inference/38688143#38688143 ale musisz czekać.

edytowany 1x, ostatnio: Koziołek, 2018-07-26 14:00

Pozostało 580 znaków

2018-07-26 18:11
0

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

Pamiętaj, aby zafajkować najlepszą Twoim zdaniem odpowiedź (to jest ten 'tick' poniżej łapki w górę). - Patryk27 2018-07-26 18:26

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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