Почему TypeScript не проверяет автоматически безопасность типов для переменной this? - PullRequest
1 голос
/ 06 мая 2019

Этот пример компилируется с 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тип "это" по умолчанию?

1 Ответ

1 голос
/ 06 мая 2019

как и ожидалось

Не совсем. Типовая аннотация 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?

Просто потому, что TypeScript происходит из естественного и возрастающего мира, если заставить ваш JavaScript просто работать с TypeScript. Это, к сожалению, накладывает некоторую (все еще намного меньше, чем на JS) нагрузку на разработчиков.

Кто-то может захотеть компилировать этот код JavaScript:

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

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

Вещи разрешены просто потому, что они явно не запрещены . По моему мнению, приветствуется запрос об отказе в этом деле 10

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...