打字稿,为什么只有一些属性可以访问?

时间:2014-05-02 07:41:21

标签: typescript

我正在尝试在Typescript中做一些基本的东西。我已经宣布了这样的课程。由于我想使用类的成员属性,我不想在nameChanged函数中使用this关键字。

class testController {
        constructor()
        {
        }
        reaction:string = "trist";
        name:string = "erik";
        showReaction:boolean = false;

        nameChanged()
        {
            if(name=="olle")
            {
                this.reaction = "Yippie";
                this.showReaction = true;
            }
            else { this.showReaction = false; }
        }

    }

如果我写行

        this.reaction = "Yippie";

使用'this'键盘,我收到编译错误。无法找到符号'反应'。 showReaction属性也是如此,但name的行为与预期的一样。

我错过了什么吗?我怎样才能做出反应,showReaction的行为就像名字一样?

2 个答案:

答案 0 :(得分:1)

与JavaScript类似,TypeScript需要this上下文来建立"其中"在对象上定位函数和属性。没有它,一切都将是全局的(更确切地说,它将在范围链中搜索所请求的变量声明)。并且,在TypeScript中,编译器将捕获尝试使用全局变量但未定义的实例。

与其他语言(如C#)不同,在类的实例方法中没有可用的默认上下文(由使用情况确定的隐式this)。当您想要引用实例方法和属性时,您需要明确并使用this

如果name在不使用this.name的情况下有效,则意味着在您的类定义的函数的上下文之外的其他地方定义了全局name。例如,它可能是这样的:

var name: string="global";
class Test {
    name: string;
    public helloName():string {
       return "hello " + name;
    }
}

var t = new Test();
t.name = "instance";

var result = t.helloName();  // result = "hello global"

如果修改了函数体以引用this.name

return "hello " + this.name;

输出结果为:

var result = t.helloName();  // result = "hello instance"

答案 1 :(得分:0)

访问名称不是指类成员名称。您实际上是在访问全局名称变量。您只能使用this关键字访问类成员。