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