代码之家  ›  专栏  ›  技术社区  ›  Ben

TypeScript如何推断“this”的类型?

  •  2
  • Ben  · 技术社区  · 6 年前

    推理策略 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
    

    如果你把代码放进打字机里 Playground ,并检查 里面 f() ,您可以看到它被推断为 this: this ,表示 A

    在这种情况下,我想这意味着 是绑定到 A ,并且不能引用全局对象。否则, this: Any .

    但实际上,正如 f1() f 在的上下文之外调用 A ,它仍然可能是全局对象。

    所以在我看来 里面 应该是 ,不是 这个:这个 . 只有当函数 f级 这个:这个 . 例如:

    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
    

    2 回复  |  直到 6 年前
        1
  •  2
  •   Lux    6 年前

    所以在我看来,f()中这个的推断类型应该是:any,而不是:this。

    this 在类函数中实际上是类的一个实例。但是 ! 理解这一点很重要!类型保证并不适用于所有情况。他们真的不能。

    非常 充满活力。无法在编译时分析所有这些动态。

    千万不要这样做:

    const x = foo.x;
    x();
    

    实际上,这样做的效果是,较旧的类模型,然后像ember对象模型这样的ES6类,很难与typescript一起使用——这些假设根本站不住脚。即使是最好的打字也有局限性。在JS中你可以做一些你不能在TS中定义的事情,但是TS对所有其他情况都很有帮助。

        2
  •  1
  •   dimvar    6 年前

    在你的例子中,即使 this 确实可以 any A ,这就是Typescript所选择的。然而,它可能会在 f1() ,因为方法是作为函数调用的(即,没有 ).