Typescript:require 语句不是 import 语句的一部分

Typescript : require statement not part of an import statement

打字稿版本 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

我应该如何重写这个要求? 感谢反馈

TypeScript 模块是 ES6 模块的实现。 ES6 模块是静态的。您的问题来自动态路径:path.join(process.cwd() + "/data")。编译器无法在编译时确定它是哪个模块,linter 不喜欢导致 any.

的原因

您应该使用模块的静态路径。在编译时,TypeScript 解析它。它会影响正确的导出类型 (IUser[]) 到 users.

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

注意:如果您的模块 data 只包含数据,您可以考虑将其更改为 JSON 文件,可以加载(Node.js)或捆绑(Webpack) .

更新(自 2019 年 5 月起)— 也可以使用 dynamic import,TypeScript 接受静态和动态路径:

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

另请参阅:TypeScript 2.4 Release Notes

可能你需要dynamic module loading,代码如下:

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

需要使用 provide 插件,但 require 和动态导入对我来说都不起作用,不过这个结构有帮助:

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

如果你可以 运行 代码正确但 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 目录
    }
};