Стратегия вывода this
в TypeScript меня смущает, например:
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 и проверите тип this
внутри f()
, вы увидите, что он имеет тип this: this
, что означает подтип A
.
В этой ситуации, я думаю, это означает, что this
привязан к A
и не может ссылаться на глобальный объект. В противном случае this
должен быть выведен как тип this: Any
.
Но на самом деле, как показано в вызове f1()
, если функция f
вызывается вне контекста A
, она все равно может быть глобальным объектом.
Так что, по моему мнению, предполагаемый тип this
внутри f()
должен быть this: Any
, а не this: 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
на самом деле?