2016-08-01 33 views
1

这里是我的Greeter类:构造不具约束力的参数来上课情境

// logger.ts 
export class Logger { 
    constructor() {} 

    public log(msg : string) { 
    console.log(msg); 
    } 
} 

// greeter.ts 
import { Logger } from "./logger"; 

class Greeter { 
    public foo: string; 
    private l : Logger; 
    constructor(l : Logger) { 
    this.foo = "bar"; 
    this.l.log(this.foo); 
    } 
} 

let g = new Greeter(new Logger()); 
console.log(g.foo); 

此代码编译成功。但是当我运行它时,我得到错误:

Uncaught TypeError: Cannot read property 'log' of undefined 

发生了什么?

更新: 它也失败了typescript playground以及。

回答

1

在你的构造你不设置私有字段l
试一试像这样

constructor(l : Logger) { 
    this.foo = "bar"; 
    this.l = l; 
    this.l.log(this.foo); 
} 

或(学分去torazaburo

constructor(private l : Logger) { 
    this.foo = "bar"; 
    this.l.log(this.foo); 
} 

见的jsfiddle here

+0

或者更好,'构造函数(私人l:记录器)'。 – 2016-08-01 05:06:19

+0

thx - 合并它 – DAXaholic

0

您从未分配到this.l。所以固定代码:

class Logger { 
    constructor() {} 

    public log(msg : string) { 
    console.log(msg); 
    } 
} 

class Greeter { 
    public foo: string; 
    private l : Logger; 
    constructor(l : Logger) { 
    this.foo = "bar"; 
    this.l = l; // !!!!!This line is the fix!!!!! 
    this.l.log(this.foo); 
    } 
} 

let g = new Greeter(new Logger()); 
console.log(g.foo);