我使用create-react-app
和TypeScript设置来创建我的应用样板,此后没有更改tsconfig.json
。我的src目录之外有一些代码,因此使用npm link
来使用它,因此可以通过符号链接在我的本地node_modules
中使用。
这是有问题的课程:
import { AuthState } from '../DataTypes/AuthState'
export class AuthFilters {
constructor(private authState: AuthState) {}
signedIn() {
return this.authState.isSignedIn
}
guest() {
return !this.signedIn()
}
}
这是我尝试使用它的方式:
import { connect } from 'react-redux'
import { Header, HeaderStateProps, HeaderDispatchProps } from './Header'
import { AuthFilters } from 'shared/Functions/AuthFilters'
import { AppState } from '../../redux/root'
export const HeaderContainer = connect<HeaderStateProps, HeaderDispatchProps>(
(state: AppState) => ({
// other props
authFilters: new AuthFilters(state.auth)
})
)(Header)
似乎一切都应该工作,无论是linter还是编译器都不会抛出任何错误,但这是在运行时发生的情况:
TypeError: WEBPACK_IMPORTED_MODULE_2_shared_Functions_AuthFilters 。AuthFilters不是构造函数
实际上,当我尝试在console.log(AuthFilters)
中访问HeaderContainer
时,它是undefined
。我发现的另一个问题是,当您使用编译器的--outFile
参数并且未按正确的顺序放置导入时,可能会导致此类错误。但是,由于我没有设置编译器,所以我不确定如何以及在何处确切地检查编译器选项,或者不确定导入的顺序...
以防万一,这是我的tsconfig.json
,没有提及outFile
:
{
"compilerOptions": {
"baseUrl": ".",
"outDir": "build/dist",
"module": "esnext",
"target": "es5",
"lib": [
"esnext",
"dom"
],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"importHelpers": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
},
"exclude": [
"node_modules",
"build",
"scripts",
"acceptance-tests",
"webpack",
"jest",
"src/setupTests.ts"
]
}
更新:我尝试将shared
文件夹实际移动到项目中,但没有解决问题。不过,奇怪的是,将文件夹的内容提取到src
目录中后,它开始工作...
这意味着它在导入./shared/Functions/AuthFilters
而不是导入./Functions/AuthFilters
时起作用。