Webpack 别名 Angular - 不能使用命名空间 'UtilsService' 作为类型
Webpack alias with Angular - Cannot use namespace 'UtilsService' as a type
我有一个项目 Angular 6, Typescript, webpack 4.
我想使用 alias in webpack 以使我的导入语句更清晰。
这是我在 webpack 中的代码:
resolve: {
alias: {
assets: `${helpers.root('src/assets/')}`,
app: `${helpers.root('src/app/')}`
},
}
"assets" 别名工作正常!
我在组件代码中以这种方式使用 "app" 别名:
import { UtilsService } from 'app/_services/utils.service';
这是组件的构造函数:
constructor( @Inject( UtilsService ) private utils: UtilsService, ) {
}
我在 import 语句上没有错误,所以我猜别名以某种方式起作用。
但是我在构造函数中出现以下错误:
TS2709: 不能使用命名空间 'UtilsService' 作为类型。
我一定是在某处遗漏了一些配置,但不知道是什么?
任何帮助将不胜感激
编辑:
根据 kemsky 和 David 的评论,这是我尝试过的:
我在tsconfig.json中添加了以下内容:
"baseUrl": ".",
"paths": {
"@app": ["src/app/"] // This mapping is relative to "baseUrl"
}
我修改webpack.config.js有:
resolve: {
alias: {
assets: `${helpers.root('src/assets/')}`,
'@app': `${helpers.root('src/app/')}`
},
}
我尝试使用以下方式导入:
import { UtilsService } from 'app/_services/utils.service';
我的组件的构造函数中仍然有同样的错误:
constructor( private utils: UtilsService, ) {}
TS2709: 不能使用命名空间 'UtilsService' 作为类型。
如果我将导入语句更改为不存在的内容,则会出现以下错误:
Module not found: Error: Can't resolve '@DONT_EXIST/_services/utils.service'
这让我认为问题出在 tsconfig 上。
注:
我正在使用 awesome-typescript-loader,也许它是链接的,这就是我在 webpack.config.js
中加载 tsconfig.json 的方式
module: {
rules: [
{
enforce: 'pre',
test: /\.ts$/,
use: [
{
loader: 'tslint-loader'
}
]
},
{
test: /\.ts$/,
use: [
{
loader: '@angularclass/hmr-loader',
options: {
pretty: !isProd,
prod: isProd
}
},
{
loader: 'ng-router-loader',
options: {
loader: 'async-import',
genDir: 'compiled',
aot: AOT
}
},
{
loader: 'awesome-typescript-loader',
options: {
configFileName: 'tsconfig.json',
useCache: !isProd
}
},
{
loader: 'angular2-template-loader'
}
],
exclude: [/\.(spec|e2e)\.ts$/]
},
定义路径映射时,有必要添加'*'以便它适用于所有子路径(因为您实际上是在定义一个模式)
所以你的tsconfig.json应该包含
"baseUrl": ".",
"paths": {
"@app/*": ["src/app/*"] // This mapping is relative to "baseUrl"
}
这样,所有匹配 @app/*
的模块,例如
import {x} from '@app/<moduleName>;
将解析为
<baseUrl>/src/app/<moduleName>
有关模块分辨率的更多信息here
我有一个项目 Angular 6, Typescript, webpack 4.
我想使用 alias in webpack 以使我的导入语句更清晰。
这是我在 webpack 中的代码:
resolve: {
alias: {
assets: `${helpers.root('src/assets/')}`,
app: `${helpers.root('src/app/')}`
},
}
"assets" 别名工作正常!
我在组件代码中以这种方式使用 "app" 别名:
import { UtilsService } from 'app/_services/utils.service';
这是组件的构造函数:
constructor( @Inject( UtilsService ) private utils: UtilsService, ) {
}
我在 import 语句上没有错误,所以我猜别名以某种方式起作用。
但是我在构造函数中出现以下错误:
TS2709: 不能使用命名空间 'UtilsService' 作为类型。
我一定是在某处遗漏了一些配置,但不知道是什么?
任何帮助将不胜感激
编辑: 根据 kemsky 和 David 的评论,这是我尝试过的:
我在tsconfig.json中添加了以下内容:
"baseUrl": ".",
"paths": {
"@app": ["src/app/"] // This mapping is relative to "baseUrl"
}
我修改webpack.config.js有:
resolve: {
alias: {
assets: `${helpers.root('src/assets/')}`,
'@app': `${helpers.root('src/app/')}`
},
}
我尝试使用以下方式导入:
import { UtilsService } from 'app/_services/utils.service';
我的组件的构造函数中仍然有同样的错误:
constructor( private utils: UtilsService, ) {}
TS2709: 不能使用命名空间 'UtilsService' 作为类型。
如果我将导入语句更改为不存在的内容,则会出现以下错误:
Module not found: Error: Can't resolve '@DONT_EXIST/_services/utils.service'
这让我认为问题出在 tsconfig 上。
注:
我正在使用 awesome-typescript-loader,也许它是链接的,这就是我在 webpack.config.js
中加载 tsconfig.json 的方式module: {
rules: [
{
enforce: 'pre',
test: /\.ts$/,
use: [
{
loader: 'tslint-loader'
}
]
},
{
test: /\.ts$/,
use: [
{
loader: '@angularclass/hmr-loader',
options: {
pretty: !isProd,
prod: isProd
}
},
{
loader: 'ng-router-loader',
options: {
loader: 'async-import',
genDir: 'compiled',
aot: AOT
}
},
{
loader: 'awesome-typescript-loader',
options: {
configFileName: 'tsconfig.json',
useCache: !isProd
}
},
{
loader: 'angular2-template-loader'
}
],
exclude: [/\.(spec|e2e)\.ts$/]
},
定义路径映射时,有必要添加'*'以便它适用于所有子路径(因为您实际上是在定义一个模式)
所以你的tsconfig.json应该包含
"baseUrl": ".",
"paths": {
"@app/*": ["src/app/*"] // This mapping is relative to "baseUrl"
}
这样,所有匹配 @app/*
的模块,例如
import {x} from '@app/<moduleName>;
将解析为
<baseUrl>/src/app/<moduleName>
有关模块分辨率的更多信息here