Я использую Typescript с pg-promise и не совсем понимаю, почему я не могу импортировать различные классы и перечисления, как обычно. Обычно, когда я использую библиотеку, я импортирую тип, использую его, и он отлично работает. В приведенном ниже коде я пытаюсь создать «режим», который будет использоваться в моих транзакциях, поэтому я импортирую TransactionMode
и isolationLevel
, но на самом деле они не определены во время выполнения (нет ошибок во время разработки и во время компиляции). esModuleInterop
есть true
в моем tsconfig.json
.
import pgPromise, { isolationLevel, TransactionMode } from "pg-promise";
const pgp = pgPromise();
// Doing this works, but I don't understand why it's necessary.
// const { TransactionMode, isolationLevel } = pgp.txMode;
// Here the imported TransactionMode and isolationLevel are undefined
const mode = new TransactionMode({ tiLevel: isolationLevel.serializable });
(...)
для использования в моем коде, вместо того, чтобы вытащить имя
@vitaly-t Я не получил ответа, к тому же ответ, который вы дали, уже был изложен в моем вопросе. Я спрашивал, «почему» мне пришлось импортировать isolationLevel
и TransactionMode
из пространства имен вместо того, чтобы использовать стандартный механизм import
, а затем использовать импортированные элементы. Вы сказали, что это потому, что ваша библиотека написана на JS, но я использовал много JS-библиотек с объявлениями типов TS, и я могу просто использовать импортированные объекты. Я не говорю, что вы сделали что-то не так, просто ищите причину.
Оригинальная библиотека реализует внутреннее пространство имен txMode {isolationLevel, TransactionMode}
. TypeScript не может обойти пространства имен JavaScript, вы должны использовать комбинацию, при которой вы импортируете содержащее пространство имен, а затем извлекаете его свойства. Другого пути нет.
import {txMode} from 'pg-promise';
const {TransactionMode, isolationLevel} = txMode;
import * as pgPromise from 'pg-promise';
const {TransactionMode, isolationLevel} = pgPromise.txMode;
почему я не могу импортировать различные классы и перечисления, как обычно?
Поскольку pg-promise — это библиотека JavaScript с некоторыми объявлениями TypeScript поверх нее, это не собственный модуль TypeScript. На самом деле он был написан так давно, что никакого TypeScript тогда не существовало.
P.S. Я автор pg-promise.
ОБНОВИТЬ
После этого была обновлена txMode
декларация , которая теперь позволяет избежать исходной проблемы.
Спасибо за ответ. Если вы не возражаете, я спрошу (я изучаю JS/TS), есть ли способ для библиотеки JS объявить типы TS таким образом, чтобы они соответствовали внутренней структуре библиотеки? Другими словами, импорт объекта или типа означает, что я могу использовать его «как есть». Я использовал много библиотек JS с типами TS и никогда раньше не сталкивался с этой проблемой. Что отличает pg-promise в этом отношении?
Смотрите ОБНОВЛЕНИЕ в моем ответе.
Вы получили свой ответ, плюс посмотрите обновление там. Пожалуйста, примите, если на этом проблема будет решена.