Как объявить модуль в TypeScript с объектом в качестве экспорта по умолчанию

В проекте TypeScript я хотел бы использовать стороннюю библиотеку, которая не предоставляет определения типов. Поэтому мне нужно придумать собственное объявление модуля. То, что модуль в основном экспортирует, выглядит так:

const foo = {
  bar () {
    return 23;
  }
};

module.exports = foo;

Итак, теперь вопрос в том, как придумать объявление модуля. Прежде всего, очевидно, что модуль использует default экспорт, а не именованный. Этот экспорт по умолчанию - это объект, у которого есть методы. Итак, я попробовал это:

declare module 'foo' {
  export default {
    bar(): number;
  };
}

Однако компилятор TypeScript жалуется, что:

Выражение оператора экспорта должно быть идентификатором или квалифицированным именем во внешнем контексте.

Что это значит? Используя bar, я использовал идентификатор, не так ли? И что означает «квалифицированное имя в окружающем контексте»?


person Golo Roden    schedule 21.07.2019    source источник


Ответы (1)


Используя панель, я использовал идентификатор, не так ли?

Ошибка говорит об объекте предложения экспорта. Хотя вы использовали bar в качестве идентификатора, в частности, в качестве имени метода, вы не экспортируете этот идентификатор, вы экспортируете литерал объекта, который его содержит.

In

declare module 'foo' {
  export default {bar(): number};
}

идентификатор bar относится к методу экспортируемого значения, а не к самому экспортируемому значению.

Чтобы исправить это, напишите

declare module 'foo' {
  const foo: {bar(): number};
  export default foo;
}

Полное имя - это имя, на которое ссылаются путем уточнения его имени с охватывающей его областью действия, как в a.b

declare module 'foo' {
  namespace ns {
    const foo: {bar(): number};
  }
  export default ns.foo; 
} 
person Aluan Haddad    schedule 21.07.2019
comment
Спасибо за ваш ответ, но, к сожалению, я не совсем понял это предложение: […] относится к методу экспортируемого значения, а не к самому экспортируемому значению. Не могли бы вы объяснить немного подробнее? - person Golo Roden; 21.07.2019
comment
Я попытался немного уточнить. Обычно bar - это имя метода, но вы экспортируете default {bar}, а не default bar. Возможно, вы запутались между export {name} (список экспорта, содержащий имя) и export default name, что эквивалентно export {name as default } - person Aluan Haddad; 21.07.2019