Typescript: оператор require не является частью оператора импорта

Машинопись версии 2.2.2

Я написал это требование в моем UserRoutzr.ts

const users = <IUser[]> require(path.join(process.cwd() + "/data"));

TSLint выдает следующее предупреждение:

require statement not part of an import statement

если бы я изменил его на:

import users = <IUser[]> require(path.join(process.cwd() + "/data"));

Потом выдает ошибку:

TS1003 Identifier expected

Как мне переписать это требование? спасибо за отзыв


person Community    schedule 30.03.2017    source источник
comment
Вам нужно построить путь, как это? нельзя просто использовать ./data? Предполагая, что процесс является запущенным процессом.   -  person Juan    schedule 30.03.2017
comment
Я пытался, но ./data не будет определен в каталоге сборки...?   -  person    schedule 30.03.2017


Ответы (4)


Модули TypeScript являются реализацией модулей ES6. Модули ES6 являются статическими. Ваша проблема исходит из динамического пути: path.join(process.cwd() + "/data"). Компилятор не может определить, какой это модуль во время компиляции, а линтеру не нравятся причины, приводящие к any.

Вы должны использовать статический путь к модулю. Во время компиляции TypeScript разрешает его. И это влияет на правильный экспортируемый тип (IUser[]) на users.

import users = require("./yourModuleThatExportsUsers");

Примечание. Если ваш модуль data содержит только данные, вы можете изменить его на файл JSON, который можно загрузить (Node.js) или связать (Webpack).

ОБНОВЛЕНИЕ (от мая 2019 г.) — также можно использовать динамический импорт с который TypeScript принимает статические и динамические пути:

const users = await import("./yourModuleThatExportsUsers");

См. также: Примечания к выпуску TypeScript 2.4

person Paleo    schedule 30.03.2017

может быть вам нужна динамическая загрузка модуля и такой код:

import {IUser} from './lib/user';
const users:IUser[] = require(path.join(process.cwd() + "/data"));
person holi-java    schedule 30.03.2017

если вы можете правильно запустить код, но eslint сообщает об ошибке, вы можете добавить /* eslint-disable */над кодом ошибки, подобным этому


/* eslint-disable */
const path =  require("path");
module.exports = {
    lintOnSave: false,
    chainWebpack: config => {

        const dir = path.resolve(__dirname, "src/assets/icons");

        config.module
            .rule("svg-sprite")
            .test(/\.svg$/)
            .include.add(dir).end() // 包含 icons 目录
            .use("svg-sprite-loader").loader("svg-sprite-loader").options({extract: false}).end();
        /* eslint-disable */
        config.plugin("svg-sprite").use(require("svg-sprite-loader/plugin"), [{plainSprite: true}] || []);
        config.module.rule("svg").exclude.add(dir); // 其他 svg loader 排除 icons 目录
    }
};

person hezhongfeng    schedule 09.07.2020

Необходимо было использовать плагин предоставления, но ни требуемый, ни динамический импорт не работали для меня, хотя эта конструкция помогла:

module.exports = {
  // ..
  chainWebpack: (config) => {
    config.plugin('provide').use(require('webpack').ProvidePlugin, [
      // ..
    ])
  },
person ego    schedule 02.07.2020