переписывание существующего websocket для использования с typescript

#typescript #ws

#typescript #ws

Вопрос:

возникли проблемы с преобразованием существующего ws в typescript из javascript. Не могу понять, какой тип возвращаемых функций async socketHost и почему я не могу получить к ним доступ через ключевое слово ‘this’

вот код:

 const config = {
    production: {
        socketHost: 'wss://someName.com/ws',
    },
    development: {
        socketHost: 'ws://localhost:5555',
    },
};
module.exports = config[process.env.NODE_ENV || 'production'];
  

ошибка:

 Cannot compile namespaces when the '--isolatedModules' flag is provided.
  

socket.ts

 import { socketHost } from 'config';

function connect():Promise<WebSocket {
return new Promise(
    (resolve, reject): Promise<void> => {
        const src = socketHost;
        const ws = new WebSocket(src);
        ws.onopen = () => {
            ws.onmessage = () => resolve(ws);
        };
        ws.onerror = err => {
            return reject(err);
        };
    },
);
}


class SocketService {
public constructor() {
    if (!SocketService.instance) {
        SocketService.instance = this;
    }
    this.reconnectionCount = 0;
    return SocketService.instance;
}

public unsubscribe(model, data, socket = this.socket): void {
    if (socket amp;amp; socket.readyState === 1) {
        socket.send(JSON.stringify(['leave', model, data]));
    } else {
        processError('unsubscribe failed');
    }
}

public async initSocket() {
    if (this.socket amp;amp; this.socket.readyState === 1) {
        return this.socket;
    }
    try {
        const socket = await connect();
        this.reconnectionCount = 0;
        this.socket = socket;
        return socket;
    } catch (error) {
        console.log('error', error);

        processError(`initSocket => ${error}`, this.reconnectionCount);
        if (this.reconnectionCount < 60) {
            setTimeout(() => {
                this.initSocket();
                this.reconnectionCount = this.reconnectionCount   1;
            }, 1000);
        } else {
            console.info('await connection 10s');
            setTimeout(() => {
                this.initSocket();
            }, 10000);
        }
        this.socket = null;
    }
    return null;
}

public async init() {
    const ws = await this.initSocket();
    if (!ws) return;
    // const chainOrder = this.getChain(order);

    ws.onmessage = ({ data: message }) => {
        if (message) {
            console.log('message', message);

            const data = JSON.parse(message);
            resolver(data);
        }
    };

    ws.onerror = error => {
        processError('subscribeFull err', error);
    };

    ws.onclose = ({ wasClean, code, reason }): void => {
        if (wasClean) {
            console.warn('socket closed clear');
        } else {
            processError('socket closed unexpected');
            this.reconnectSocket();
        }
        console.info(`Code: ${code} reason: ${reason}`);
    };
    this.subscribe();
}

public async subscribe(): Promise<void> {
    const { socket } = this;
    try {
        if (socket.readyState === 1) {
            await socket.send(JSON.stringify('init'));
        }
    } catch (error) {
        console.log('subscribe', error);
    }
}

public async closeSocket(): Promise<void> {
    if (this.socket) {
        await this.socket.close();
    }
    this.reconnectionCount = 0;
}

public async reconnectSocket(): Promise<void> {
    await this.closeSocket();
    await this.initSocket();
    await this.subscribe();
}
}
  

ошибки

 "File: config/index.ts is not a module.",
  

на данный момент я переписал все приложение целиком, и я уперся в стену и просто не понимаю, как переписать эту часть, даже после просмотра документов в течение 3 часов.

любая помощь была бы высоко оценена

Комментарии:

1. При ошибке isolatedModules, возможно, просто удалите этот флаг из tsconfig. С ошибкой config / index.ts это связано с настройкой moduleResolution

2. проблема в том, что я использую babel 7 eslint для этого проекта. может быть, мне следует просто переписать сокет и конфигурацию с нуля?

3. иногда это более простой способ разобраться, но вы, вероятно, снова столкнетесь с этими ошибками в какой-то другой момент.

4. обычно ответ каким-то образом связан с параметрами компилятора, когда я вижу подобные ошибки.

5. я думал об изменении параметров компилятора, но тогда я бы потерял некоторые функции, предоставляемые babel.