【问题标题】:How to get "this" type in typescript如何在打字稿中获得“这个”类型
【发布时间】:2019-07-25 07:13:15
【问题描述】:
class A {
    method : this = () => this;
}

我要的是this,作为返回类型,表示当前类,即A的子类a。所以,方法只返回与类相同类型的值(不仅仅是基类A)。


我想我有类似的东西:

class A {
    method : <T extends A> () => T = () => this;
}

但这似乎是多余的。我复制了A。当然有更好的方法来做到这一点?..

【问题讨论】:

  • 为什么this会返回A的子类;根据定义,this 代表执行上下文——在上面的代码的情况下,即 A。在第二个示例中,执行上下文仍然是 A,所以返回 this 将返回 A。请考虑阅读以下内容:@ 987654321@
  • @RandyCasburn 使用this 只是一个示例,以轻松说明我正在尝试做的事情。当然this 不代表一个类。
  • 正如我在下面对 artem 提到的,我认为您将 JavaScript 的运行时特性与 TypeScript 的静态类型检查特性混淆了。但我意识到我一定误解了你的问题。
  • @RandyCasburn 实际上我只是很愚蠢。 this 就像我想要的那样作为一种类型工作。但是,我将 methods 类型设置为 this,而不是 返回 this 的函数。

标签: javascript typescript types typescript-typings typescript-generics


【解决方案1】:

你几乎明白了,method 属性的类型应该声明为() =&gt; this,而不仅仅是this。编译器理解当用作类型时,thispolymorphic

class A {
    method : () => this = () => this;
}

class B extends A {

}

const b = new B();

const bb = b.method(); // inferred as const bb: B;

【讨论】:

  • 因为执行上下文现在是 B。TypeScript 文档中描述的多态,是的,但是它的工作方式是普通的旧 JavaScript。
  • 是的,但问题是关于如何在 TypeScript 中正确描述其类型。没有为class B 定义method,因此A 中的method 需要一些特殊的方式来声明其类型。
  • 是的,你是对的。但是 OP 继续将 TypeScript 的静态类型检查特性与 JavaScript 的运行时执行混淆(因此,方法只返回值)。但我现在意识到我可能误解了意图。
猜你喜欢
  • 2016-04-16
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2018-05-24
  • 1970-01-01
  • 2019-06-06
相关资源
最近更新 更多