2016-12-10 8 views
2

Экспериментируя с ограничениями на общих функциях в Hack, я ассоциировалась следующее:Hacklang - Возможны ли ограничения типа с константами типов?

<?hh // strict 
class Base {} 
class Derived extends Base {} 
abstract class ImplBase { 
    abstract const type T as Base; 
    public function foo<Tf as this::T>(Tf $v): void {} 
} 
class ImplDerived extends ImplBase { 
    const type T = Derived; 
} 
function foo(ImplDerived $v): void { 
    bar($v); 
} 
function bar(ImplBase $v): void { 
    $v->foo(new Base()); 
    $v->foo(new Derived()); 
} 

Принцип достаточно прост: вентиляционная из бетона ImplDerived, делает проверки типов лечения ImplBase::T как абстрактный типа в bar, что может литься в Base с помощью ограничения или сохраняет ссылку на T = Derived? Однако, как ни странно, ответ не является ни тем, ни другим. Каждая строка в bar не может по другой причине:

  • $v->foo(new Base()); терпит неудачу, потому что Tf является «ограниченным зависимого типа <expr#1>::T [...] со ссылкой на new Base()».
  • $v->foo(new Derived()); терпит неудачу, потому что пуф! Tf неожиданно Base! «[this::T] - объект типа Base [...] в результате расширения постоянной типа ImplBase::T».

Я прошу невозможного или это возможно еще не реализовано полностью?

ответ

2

Забавно, что вы второй человек, который упомянул об этом сегодня; первый из них был одним из разработчиков команды Hack, который занимается улучшением взаимодействия между константами типов и ограничениями.

Итак, да, мы изучаем это. Никаких обещаний на какой-либо временной шкале для ее сортировки пока нет.