Каков наиболее совместимый способ импорта CommonJS из TypeScript?

Из этих трех способов импорта модуля CommonJS из TypeScript:

  1. import * as foo from "foo
  2. import foo = require("foo")
  3. const foo = require("foo")

Что наиболее совместимо со спецификациями TS и модуля ES?

То есть, когда / если библиотека "foo" переключается на использование модулей ES, что из вышеперечисленного наименее вероятно сломается или станет странным?

Обновление: (1) выглядит лучше, поскольку это настоящий синтаксис модуля ES, но я обеспокоен сохранением предполагаемой семантики импортируемого модуля CommonJS. Например, если ожидается побочный эффект при импорте модуля, мы хотели бы сохранить эту семантику при использовании import * as синтаксис.

Еще одно обновление: мы нацелены на модули ES. Отдельным инструментом занимается ES Module -> преобразование.

1 ответ

Решение
const foo = require("foo")

Это худший, foo будет напечатан как любой, я бы избежал этого любой ценой

import foo = require("foo")

Это специфический для машинописного синтаксиса импорт, и его снова следует избегать, насколько это возможно. Во время выполнения он компилируется в var foo = require("foo"), но во время компиляции он предлагает безопасность типов. Это единственный способ импортировать модуль, который использует назначение экспорта.

import * as foo from "foo"

Это официальный синтаксис ES2015, и его следует поощрять всякий раз, когда это возможно (за исключением случая назначения экспорта, я думаю, что он может использоваться во всех других случаях).

Если вы компилируете в commonjs приведенный выше синтаксис все равно будет передаваться как const foo = require("./foo"); во время выполнения, поэтому он должен вести себя так же.

Есть одно предупреждение: машинопись не будет генерировать импорт, который не используется, и импорт, который используется только для их типов (см. Здесь), поэтому, если вы хотите импортировать модуль для побочных эффектов, вы можете использовать этот синтаксис:

import "foo"
Другие вопросы по тегам