@legacy_js

Ошибка конфигурации typescript, как исправить?

Изучаю брокер rabbitmq, используя библиотеку rascal и nestjs.
По дефолту rabbit использует type topic, хотел изменить значение.
В nestjs создал конфиг, взятый с сайта cloudamqp , только изменены значения, библиотека в nestjs @types/rascal.

файл RascalConfig, из-за которого получаю ошибку
{
  "vhosts": {
    "v2": {
      "connection": {
        "slashes": true,
        "protocol": "amqp",
        "hostname": "localhost",
        "user": "smoke86",
        "password": "smoke86",
        "port": 5672,
        "vhost": "v2",
        "options": {
          "heartbeat": 5
        },
        "socketOptions": {
          "timeout": 10000
        }
      },
      "exchanges": {
        "user_ex": {
          "type": "direct"
        }
      },
      "queues": ["rabbit_q"],
      "bindings": {
        "v2h": {
          "source": "user_ex",
          "destination": "rabbit_q",
          "destinationType": "queue",
          "bindingKey": "uKey"
        }
      },
      "publications": {
        "user_pub": {
          "vhost": "v2",
          "exchange": "user_ex",
          "routingKey": "uKey"
        }
      },
      "subscriptions": {
        "demo_sub": {
          "queue": "rabbit_q",
          "prefetch": 1
        }
      }
    }
  }
}

RascalProvider.ts

import { Injectable } from '@nestjs/common';
import { BrokerAsPromised } from 'rascal';
import RascalConfig from '../configs/rascal.config.json'

@Injectable()
export class RascalProvider {
  private rascal = BrokerAsPromised;

  async connectRascal(): Promise<BrokerAsPromised> {
    return (await this.rascal.create(RascalConfig)) // Подчеркивает RascalConfog, ошибка тут
    .on('error', console.error);
  }
}


В другом микросервисе я не использую nestjs, там использую rascal и express и тот же конфиг раскаля, и там все прекрасно работает, не какой ошибки я не получаю. Предполагаю что проблема в TypeScript, но как ее исправить, так и не смог найти решение

Код ошибки
src/connect/rascal.provider.ts:10:42 - error TS2345: Argument of type '{ vhosts: { v2: { connection: { slashes: boolean; protocol: string; hostname: string; user: string; password: string; port: number; vhost: string; options: { heartbeat: number; }; socketOptions: { timeout: number; }; }; ... 4 more ...; subscriptions: { ...; }; }; }; }' is not assignable to parameter of type 'BrokerConfig'.
Types of property 'vhosts' are incompatible.
Type '{ v2: { connection: { slashes: boolean; protocol: string; hostname: string; user: string; password: string; port: number; vhost: string; options: { heartbeat: number; }; socketOptions: { timeout: number; }; }; ... 4 more ...; subscriptions: { ...; }; }; }' is not assignable to type '{ [key: string]: VhostConfig; }'.
  Property '"v2"' is incompatible with index signature.
    Type '{ connection: { slashes: boolean; protocol: string; hostname: string; user: string; password: string; port: number; vhost: string; options: { heartbeat: number; }; socketOptions: { timeout: number; }; }; ... 4 more ...; subscriptions: { ...; }; }' is not assignable to type 'VhostConfig'.
      Types of property 'exchanges' are incompatible.
        Type '{ user_ex: { type: string; }; }' is not assignable to type 'string[] | { [key: string]: ExchangeConfig; }'.
          Type '{ user_ex: { type: string; }; }' is not assignable to type '{ [key: string]: ExchangeConfig; }'.
            Property '"user_ex"' is incompatible with index signature.
              Type '{ type: string; }' is not assignable to type 'ExchangeConfig'.
                Types of property 'type' are incompatible.
                  Type 'string' is not assignable to type '"direct" | "fanout" | "headers" | "topic"'.

 10         return (await this.rascal.create(RascalConfig))


И еще заметил если изменить "exchanges и bindings" на
"exchanges": ["user_ex"],
"bindings": ["user_ex[uKey] -> rabbit_q"]
то ошибки не получаю
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
В ошибке всё написано. Прямой импорт из .json выводит недостаточно строгий тип. Метод ожидает что type будет строго одно из "direct" | "fanout" | "headers" | "topic", а получает просто string.

Можно сделать так:
return (await this.rascal.create(RascalConfig as BrokerConfig))
Но это чревато ошибками в самом конфиге.

Единственное на данный момент надёжное решение(пока не добавят эту фичу) - держать конфиг в .ts файле в виде:
const RascalConfig: BrokerConfig = { ... }
или
const RascalConfig = { ... } as const

Ну или написать простенький генератор соответствующего .d.ts к каждому .json.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы