TypeScript ES динамический `import()`

При использовании новой функции TypeScript, так называемого ES Dynamic Imports, я не могу запустить код моего изоморфного приложения на стороне сервера, используя ts-node,

Кажется, что ошибка не возникает при использовании загрузчика модуля webpack, который переносит код по-своему и запускает полученные файлы в браузере.

Ошибка, которую я получил:

case 0: return [4 /*yield*/, import("./component/main")];
                             ^^^^^^
SyntaxError: Unexpected token import

Обычно TypeScript переносит import выражение чего-то подобного: Promise.resolve(require("./component/main"))Но я не могу видеть это там.

Как это исправить? Есть ли что-то общее с ts-node? Или есть "полифилл" для node.js?

мой tsconfig.json файл:

{
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "allowJs": false,
    "experimentalDecorators": true,
    "importHelpers": true,
    "inlineSourceMap": false,
    "inlineSources": false,
    "lib": [
      "DOM",
      "ES5",
      "ES6",
      "ES7"
    ],
    "listFiles": false,
    "module": "commonjs",
    "noEmitOnError": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "preserveConstEnums": false,
    "pretty": false,
    "removeComments": false,
    "strict": true,
    "target": "es5"
  }
}

код:

import * as m from "mithril";

import LayoutComponent from "./component/layout";

const render = (
    layout: m.ComponentTypes<any, any>,
) => ({ tag, attrs }: m.Vnode<any, any>) => m(layout, attrs, m(tag as any, attrs));

export default {
    "/:path...": {
        onmatch: async (args, path) => (await import("./component/main")).default,
        render: render(LayoutComponent),
    },
} as m.RouteDefs;

1 ответ

Решение

Это ошибка в компиляторе Typescript, которая будет исправлена ​​в 2.5.

Экспорт объекта по умолчанию с помощью функции, которая импортирует файл , не скомпилирует import заявление в require утверждение в Typescript 2.4.x.

Например, пока это:

export const sudo = { run() { return import('./test3'); } }

Скомпилируем к этому:

exports.sudo = { run: function () { return Promise.resolve().then(function () { return require('./test3'); }); } };

Это:

export default { run() { return import('./test3'); } }

Компилируется в это:

exports.default = { run: function () { return import('./test3'); } };

Что явно не так. Временное решение будет следующим:

export const sudo = { run() { return import('./test3'); } }

export default sudo;

Что компилирует (правильно) в это:

exports.sudo = { run: function () { return Promise.resolve().then(function () { return require('./test3'); }); } };
exports.default = exports.sudo;
Другие вопросы по тегам