为什么TypeScript不自动检查“ this”变量的类型安全性?

时间:2019-05-06 03:55:22

标签: typescript type-safety

此示例使用npx tsc --strict a.ts(TypeScript 3.4.5)进行编译,但未检测到错误:

class A {
    m () { console.log(this.f()) }
    f () { return 'a' }
}

const a = new A()
a.m() // prints 'a'

const sock = new WebSocket('ws://invalid-host.example')
sock.onerror = a.m
// when the socket has an error,
// Uncaught TypeError: this.f is not a function

如果我在浏览器控制台中运行输出代码,则输出如上面的注释所述。


如果我将this: this添加到参数列表中,它将按预期检测到错误:

class A {
    m (this: this) { console.log(this.f()) }
    f () { return 'a' }
}

const a = new A()
a.m()

const sock = new WebSocket('ws://invalid-host.example')
sock.onerror = a.m // error TS2322: Type '(this: A) => void' is not assignable to type '(this: WebSocket, ev: Event) => any'

默认情况下是否可以通过TypeScript检查“ this”的类型?

1 个答案:

答案 0 :(得分:1)

  

符合预期

不完全是。 this类型注释可确保this结构。并不是说它不能分开(这就是您可能在想的)。

class A {
    m (this: this) { console.log(this.f()) }
    f () { return 'a' }
}

const sockF = {f(){return 'another'}, m(){}, onerror(){}}
sockF.onerror = new A().m // no error!
  

默认情况下是否可以通过TypeScript检查“ this”的类型?

不。

  

为什么TypeScript不会自动检查“ this”变量的类型安全性?

原因很简单,因为如果使您的JavaScript与TypeScript兼容,那么TypeScript来自自然而又渐进的世界。遗憾的是,这确实给开发人员带来了 some (仍然比原始JS少很多)的代码负载。

有人可能希望此JavaScript代码进行编译:

class A {
    m () { console.log(this.f()) }
    f () { return 'a' }
}

const x = new A().m;
x();

只允许使用,因为没有明确禁止使用。对于此案,我认为禁止请求会很受欢迎