gpt4 book ai didi

javascript - TypeScript 如何推断 `this` 的类型?

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:13 25 4
gpt4 key购买 nike

TypeScript中this的推理策略让我很困惑,例如:

class A {
s: String
constructor() {
this.s = "this is fine"
}
f() {
console.log(this.s)
}
}

let a = new A

a.f() // -> this is fine

let f1 = (new A).f
f1() // -> undefined

如果将代码放入 TypeScript Playground ,查看f()this的类型,可以看到推断为this:this类型,即A 的子类型。

在这种情况下,我认为这意味着this 绑定(bind)到A,并且不能引用全局对象。否则,this 应该被推断为 this: Any 类型。

但实际上,如 f1() 的调用所示,如果函数 fA 的上下文之外被调用,它仍然可以是全局对象。

所以在我看来,f()里面this的推断类型应该是this: Any,而不是this:这个。只有当函数 f 定义为箭头函数时,它才能被推断为 this: this。例如:

class A {
s: String
constructor() {
this.s = "this is fine"
}
f = () => {
console.log(this.s)
}
}

let a = new A

a.f() // -> this is fine

let f1 = (new A).f
f1() // -> this is fine

那么,这是错误还是设计特征? TypeScript 实际上是如何推断出 this 的类型的?

最佳答案

So in my opinion, the inferred type of this inside f() should be this: any, not this: this.

嗯,是的。在某些方面你是对的。不能 100% 确定类函数中的 this 确实是该类的一个实例。但是 typescript 并不意味着 100% 准确!理解这一点很重要!类型保证并非在所有情况下都适用。他们确实不能。

Javascript 非常动态。没有办法只在编译时分析所有这些动态。

因此 Typescript 完全依赖于假设和用户提供的类型信息。它应该对您有所帮助,但不会在您想要自取其辱时阻止您。

永远不要这样做:

const x = foo.x;
x();

实际上,这会导致较早的类模型和 ES6 类(如 ember 对象模型)很难与 typescript 一起使用——这些假设根本站不住脚。即使是最好的打字也有局限性。有些事情你可以在 JS 中做而不能在 TS 中定义。 TS 仍然对所有其他情况非常有帮助。

关于javascript - TypeScript 如何推断 `this` 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52241079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com