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");
可能你需要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 目录
}
};
打字稿版本 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");
可能你需要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 目录
}
};