Грешка при компилиране на TypeScript, импортиране на интерфейс по подразбиране с фигурни скоби

Когато компилирам моя TypeScript проект, компилаторът извежда следната грешка:

node_modules/@types/domutils/index.d.ts:6:10 - error TS2614: Module '"../../domhandler/lib"' has no exported member 'DomElement'. Did you mean to use 'import DomElement from "../../domhandler/lib"' instead?

Нарушителната линия е:

import { DomElement } from "domhandler";

Проблемът е, че във файла за въвеждане, от който се опитва да импортира, интерфейсът DomElement е експортиран интерфейс, който не е по подразбиране, както следва:

export interface DomElement {
    attribs?: {[s: string]: string};
    children?: DomElement[];
    data?: any;
    name?: string;
    next?: DomElement;
    parent?: DomElement;
    prev?: DomElement;
    type?: string;
}

Ако премахна фигурните скоби, това всъщност работи, но това ми се струва проблематично:

  1. Останах с впечатлението, че само експорти по подразбиране могат да бъдат импортирани без къдрави скоби. Защо това импортиране е изисква без къдрави скоби?
  2. Този проблем възниква в дефинициите на типове в папката node-modules, предоставени от DefinitelyTyped. Не искам да променя файл на зависимост. В Github няма свързани отворени проблеми, така че предполагам, че работи. Всъщност работи за колега с по-стара версия на Node (v8), но това не изглежда, че трябва да има значение.

Версии:

АКТУАЛИЗАЦИЯ

Ето моят tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "noImplicitAny": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": ".",
    "paths": {
      "*": [
        "node_modules/*"
      ]
    }
  },
  "include": [
    "src/**/*"
  ]
}

person joshua miller    schedule 24.12.2019    source източник
comment
Същият проблем при използване на sanitize-html като негово дърво на зависимости е sanitize-html -› htmlparser2 -› domutils -› domhandler. Конфигурацията (с typescript 3.6.4) работеше във възел 8 преди надстройката до възел 12.   -  person sceee    schedule 27.12.2019
comment
Бихте ли могли да проверите във вашия npm-shrinkwrap.json или package-lock.json дали има няколко версии на domutils там? И също така, кои зависимости привличат domutils в кои версии?   -  person sceee    schedule 27.12.2019


Отговори (1)


Въз основа на информация от aluanhaddad в GitHub успях да го компилирам ( и работи), въпреки че не ми харесва решението (защото всъщност изключва всякаква проверка за този модул).

Премахнах въвеждането на sanitize-html (и свързания domhandler и т.н.). TSC плаче, че не познава модула "sanitize-html", така че добавих фиктивна декларация на модул в папката си src.

src/sanitize-html.d.ts

declare module 'sanitize-html';

tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true
  },
  "lib": [
    "es6",
    "dom"
  ],
  "include": [
    "src/**/*",
    "index.ts"
  ],
  "exclude": [
    "**/*.spec.ts"
  ]
}

команда за изграждане:

tsc
person Sielu    schedule 27.02.2020