打字稿-静态变量的未定义错误

时间:2020-10-24 06:55:41

标签: node.js typescript express

我有使用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);

2 个答案:

答案 0 :(得分:1)

可以使用的版本(不带静态)和不可以使用的版本(带静态)的主要区别在于初始化成员的时间。

当成员不是静态成员时,仅当某些代码(此处未显示)正在创建包含类(DBConfig)的实例时才对其进行初始化。到那时,Configuration.appConfig已经被初始化。

成员为静态成员时,会在Configuration.appConfig尚未初始化的阶段进行更早的初始化。

克服此问题的一种方法是确保首先初始化Configuration.appConfig,例如通过使用同步调用(或其他解决方案,具体取决于此处未显示的代码段的结构)。

答案 1 :(得分:0)

关于实例/静态,实例方法属于一个类的实例(使用“ new”关键字创建的对象),而静态方法则扩展了该类模板,这意味着它们属于该类本身,并且可被所有实例访问(对象)。

因此,如果您尝试从静态方法调用实例方法,则意味着尝试访问静态方法内部已经存在的实例的实例方法。换句话说,您需要在静态方法范围内创建/拥有一个实例,以便能够访问其实例方法。

我不确定这里说明的实例/静态概念是否完全适用于打字稿,但是考虑到对静态的一般理解,从备用静态方法调用实例似乎不是一个好主意。