【发布时间】:2015-04-20 19:35:32
【问题描述】:
似乎在 typescript 类的实例方法中,typescript 编译器认为 'this' 与声明类的类型相同。
例如:
class Person {
private name: string;
constructor(name) {
this.name = name;
}
public showName() {
//Typescript believes 'this' is a 'Person', but it could be anything!
var me: Person = this;
alert("My name is " + this.name);
}
}
class Introducer {
public introduce(person: Person) {
setTimeout(person.showName, 1);
}
}
var introducer: Introducer = new Introducer();
var bob = new Person("Bob");
this.name = "Dave";
introducer.introduce(bob);
在 showName 函数中,输入“this”是“Person”的内容。然而,情况并不总是如此——就像 Introducer 类所示的示例一样(输出是“我的名字是 Dave”,而不是“我的名字是 Bob”)。
鉴于这种可能性,为什么类实例方法中的“this”类型不是“any”?
【问题讨论】:
-
根据您的推理,可以删除任何类型。静态类型可以在运行时被绕过。这不是不使用静态类型的理由。
-
补充@Tarh所说的......类型检查是在编码/编译时完成的,不是渲染代码的一部分,所以虽然可以用任何东西调用它,但它会被检查在编译期间为
Person类型。 -
@Brocco:我的问题是“this”的类型不可能在编译类型中强制执行,因为它的类型是未知的。那么为什么编译器会假设它是Person呢?静态类型可以在运行时绕过,但这是一个编译时问题。
-
因为 TypeScript 本质上是在其上添加类型的 JavaScript,所以它也维护了 JS 的作用域。这意味着 showName 函数中的
this的作用域是 Person 类,因此赋予它 Person 的类型,但是您将 name 设置为 Dave 的this在不同的范围内,其中this不是 @ 类型987654326@ -
“这意味着 showName 函数中的 this 的作用域是 Person 类,因此赋予它 Person 的类型”——如果我使用的是 fat-arrow / lambda 语法,情况就是这样,但是在我的示例中,我没有这样做。
标签: typescript