我有使用Express和Typescript构建的此节点api应用。 在启动服务器之前,我将使用所需的config初始化Configuration Class的静态变量。 但是,当我在整个应用程序的单独的Typescript类中使用此静态变量时,会不断收到此未定义的错误。
这里有什么我想念的吗?
server.ts
// Initialize Config
Configuration.initAppConfig();
server.start()
app.config.ts
import config from 'config';
const packageInfo = require('../../package.json');
// other imports
export class Configuration {
static appConfig: IAppConfig;
static initAppConfig() {
Configuration.appConfig = <IAppConfig>{
appName: packageInfo.name,
db: <IDbConfig>config.get("db"),
server: <IServerConfig>config.get("server")
}
//prevent it from getting reassigned
Object.freeze(this.appConfig);
}
}
db.config.ts
import { Configuration } from './app.config';
export class DBConfig{
private static logger = LoggerFactory.getLogger(Configuration.appConfig.appName);
// other stuffs
}
错误
private static logger = LoggerFactory.getLogger(Configuration.appConfig.appName);
^
TypeError: Cannot read property 'appName' of undefined
PS: 如果我从记录器中删除静电,它将起作用。为什么会这样呢?我真的是在头。 :|
//works
private logger: Logger = LoggerFactory.getLogger(Configuration.appConfig.appName);
//Not working - appName of undefined error
private static logger: Logger = LoggerFactory.getLogger(Configuration.appConfig.appName);
答案 0 :(得分:1)
可以使用的版本(不带静态)和不可以使用的版本(带静态)的主要区别在于初始化成员的时间。
当成员不是静态成员时,仅当某些代码(此处未显示)正在创建包含类(DBConfig)的实例时才对其进行初始化。到那时,Configuration.appConfig已经被初始化。
成员为静态成员时,会在Configuration.appConfig尚未初始化的阶段进行更早的初始化。
克服此问题的一种方法是确保首先初始化Configuration.appConfig,例如通过使用同步调用(或其他解决方案,具体取决于此处未显示的代码段的结构)。
答案 1 :(得分:0)
关于实例/静态,实例方法属于一个类的实例(使用“ new”关键字创建的对象),而静态方法则扩展了该类模板,这意味着它们属于该类本身,并且可被所有实例访问(对象)。
因此,如果您尝试从静态方法调用实例方法,则意味着尝试访问静态方法内部已经存在的实例的实例方法。换句话说,您需要在静态方法范围内创建/拥有一个实例,以便能够访问其实例方法。
我不确定这里说明的实例/静态概念是否完全适用于打字稿,但是考虑到对静态的一般理解,从备用静态方法调用实例似乎不是一个好主意。