2017-08-31 106 views
0

执行以下代码时,我得到一个TypeError属性未定义的打字稿

server.class.ts

import {Handlers} from './handlers.class'; 
export class Server{ 
    private _hInstance: Handlers; 
    static _instance: Server; 
    private constructor(){ 
     this._hInstance = new Handlers(); 
     this._hInstance.mymethod(); 
    } 
    static instance(): Server{ 
     if(!!!Server._instance){ 
      Server._instance = new Server(); 
     } 
     return Server._instance; 
    } 
} 

handler.class.ts

import { Polo } from './../extapi/polo.class'; 
export class Handlers{ 
    private _polo: Polo; 
    constructor(){ 
     this._polo = Polo.instance(); // same as Server.instance() 
    } 
    mymethod(){ 
     this._polo.someMethod(); // Error 
} 

马球类使用定义单个实例的相同技术,并提供用于返回实例的静态方法instance()。该代码单独测试,工作正常。该类型的错误引发了undefined属性_polo无法读取。这真是令人困惑,因为在其实例上调用someMethod之前已经实例化类Polo

谢谢。

+0

你能提供一个jsfiddle的问题吗? mymethod叫什么名字? – Harald

+0

@Harald'mymethod'只能在'Server'类的构造函数中调用。为了澄清,代码库很长,我不确定是否发布了整个代码(6个类,2个接口),所以我只是找出引起问题的部分。如果问题不明确,那么我会发布整个代码(我很乐意回答任何其他问题)。谢谢 –

+0

@Harald jsfiddle:https://jsfiddle.net/mr0cool/bf9e8wmy/ –

回答

0

处理程序类中的属性undefined错误是由于Polo.instance()方法返回对静态初始化的Polo对象的引用。在处理程序类中将它设为私有意味着,对于Handler的每个实例,都会声明一个新的私有属性,它将引用相同的静态实例。编译时,这不会引发任何错误。运行时,每次访问this._polo时,都无法引用静态定义的实例,并导致引用undefined。解决方案是将this._polo从私有变为静态。