Слияние кода завершено, страница обновится автоматически
В соответствии с текущей спецификацией, коллбэк, содержащий аргумент, может быть назначен только функции, чей аргумент является её объявленным родительским классом.
Пример_1:
class A_Base {}
class A_Middle extends A_Base {}
class A extends A_Middle{}
class B {}
function test(callback:(arg: A_Middle) => void) {}
test((a: A_Base):void => {}) // успех
test((a: A_Middle):void => {}) // успех
test((a: A):void => {}) // ошибка компиляции
test((a: B):void => {}) // ошибка компиляции
Все сообщения об ошибках компиляции:
TypeError: Тип '(a: A) => void' несовместим с типом '(arg: A_Middle) => void' в индексе 1 [p1_test.ets:44:6]
TypeError: Тип '(a: B) => void' несовместим с типом '(arg: A_Middle) => void' в индексе 1 [p1_test.ets:45:6]
Все вышеперечисленные случаи соответствуют спецификации и являются разумными.
Однако, когда функция test
перегружена, она может компилироваться без ошибок, и результат оказывается неожиданным.
Пример_2:
class A_Base {}
class A_Middle extends A_Base {}
class A extends A_Middle{}
class B {}
function test() { console.log("no callback") }
function test(callback:(arg: A_Middle) => void) { console.log("have callback") }
test((a: A_Base):void => {}) // успех
test((a: A_Middle):void => {}) // успех
test((a: A):void => {}) // успех
test((a: B):void => {}) // успех
И вывод:
have callback
have callback
have callback
have callback
В любом случае, последние два случая должны выдавать ошибку компиляции, как в примере_1.
test((a: A_Base):void => {}) // успех
test((a: A_Middle):void => {}) // успех
test((a: A):void => {}) // ошибка компиляции
test((a: B):void => {}) // ошибка компиляции
```### Каковы ожидаемые действия?
Ошибки компиляции выдаются в соответствии с спецификацией.
### Как воспроизвести эту ошибку
:star:
### Дополнительная информация
### Информация о версии или ветке
- [x] master
- [ ] 5.1-Release
- [ ] 5.0-Release
- [ ] 5.0-Beta1
- [ ] Release 4.1
- [ ] Release 4.0
- [ ] Release 3.2
Вход Перед тем как оставить комментарий