Node.js Typescript-静态变量的未定义错误
我使用express和typescript构建了这个节点api应用程序。 在启动服务器之前,我将使用所需的配置初始化Configuration类的静态变量。 但当我在整个应用程序的一个单独的Typescript类中使用这个静态变量时,我总是会遇到这个未定义的错误 这里有我遗漏的东西吗 server.tsNode.js Typescript-静态变量的未定义错误,node.js,typescript,express,Node.js,Typescript,Express,我使用express和typescript构建了这个节点api应用程序。 在启动服务器之前,我将使用所需的配置初始化Configuration类的静态变量。 但当我在整个应用程序的一个单独的Typescript类中使用这个静态变量时,我总是会遇到这个未定义的错误 这里有我遗漏的东西吗 server.ts // Initialize Config Configuration.initAppConfig(); server.start() import config from 'config';
// Initialize Config
Configuration.initAppConfig();
server.start()
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);
}
}
import { Configuration } from './app.config';
export class DBConfig{
private static logger = LoggerFactory.getLogger(Configuration.appConfig.appName);
// other stuffs
}
app.config.ts
// Initialize Config
Configuration.initAppConfig();
server.start()
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);
}
}
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
附言:
如果我从记录器中移除静电干扰,它就会工作。为什么会这样?我简直是在磕头|
//works
private logger: Logger = LoggerFactory.getLogger(Configuration.appConfig.appName);
//Not working - appName of undefined error
private static logger: Logger = LoggerFactory.getLogger(Configuration.appConfig.appName);
工作的版本(没有静态)和不工作的版本(有静态)之间的主要区别在于成员初始化的时间 当成员不是静态的时,只有当某些代码(此处未显示)正在创建包含类(DBConfig)的实例时,才会初始化该成员。此时,Configuration.appConfig已经初始化 当该成员是静态的时,它会在Configuration.appConfig尚未初始化的阶段更早地初始化
克服此问题的一种方法是确保首先初始化Configuration.appConfig,例如使用同步调用(或其他一些解决方案,取决于此处未显示的代码段的结构)。关于实例/静态,实例方法属于类的实例(使用“新”创建的对象)关键字)和静态方法扩展了类模板,这意味着它们属于类本身,并且可以被类的所有实例(对象)访问 因此,如果尝试从一个实例调用实例方法,那么静态方法意味着尝试访问静态方法中已经存在的实例的实例方法。换句话说,您需要在静态方法的范围内创建/拥有一个实例,以便能够访问其实例方法 我不确定这里所解释的实例/静态概念是否在typescript中完全适用于这种方式,但是考虑到对静态的一般理解,从备用静态方法调用实例似乎不是一个好主意