2016-02-17 2 views
4

Я пытаюсь написать несколько простых, функциональных примеров для оценки системы типа потока. Я пропускаю что-то очевидное, или если этот образец работы:Функция более высокого порядка, аннотации типа потока

function logger (message: string): void { 
    console.log(message); 
} 

function consumer (logFunc: logger) { 
    logFunc('foo'); 
} 

consumer(logger); 

Когда я попробовать его на tryflow.org я получаю «Callable подпись не найдена в прототипе». Я получаю такое же сообщение при запуске локально (поток 0.21.0):

8:  logFunc('foo'); 
     ^^^^^^^^^^^^^^ function call. Callable signature not found in 
    8:  logFunc('foo'); 
     ^^^^^^^ prototype 

я могу решить эту проблему путем объявления типа псевдонима в явном виде, но, похоже, ненужное дублирование (особенно для более сложных модулей):

type loggerType = (message: string) => void; 

function logger (message: string): void { 
    console.log(message); 
} 

function consumer (logFunc: loggerType) { 
    logFunc('foo'); 
} 

consumer(logger); 

только соответствующая документация, я нашел до сих пор: http://flowtype.org/docs/functions.html#function-based-type-annotations

Представьте себе, что consumer и logger отдельные модули (возможно, даже в отдельных пакетах НПМ) и более усложнять d, и logger импортируется (es6, или commonJS).

  • Это не кажется разумным писать типы дважды (logger и loggerType).
  • Также не представляется возможным повторить подпись типа logger в функции consumer. Я хочу, чтобы тип аргумента logFunc точно соответствовал функции, называемой logger. Особенно, повторение типов было бы утомительным для более сложных функций.

Любые идеи о том, как это сделать без явного повторения аннотаций типа?

ответ

7

Вы можете использовать typeof:

function consumer (logFunc: typeof logger) { 
    logFunc('foo'); 
} 

Похоже ошибка потока, что, используя выражение в позиции типа не дает вам содержательную ошибку, но я не знаком с ним так, может быть, означает что-то другое.

Ошибка в этом случае довольно запутанна, но вам может быть лучше с псевдонимом типа. Конечно, в этом фрагменте я предпочел бы ошибку на линии 15, а не на 1 и 9

enter image description here

+0

Спасибо! Я полностью упустил ключевое слово 'typeof'. Должно быть, ты ослеп, так долго смотришь. Чем больше вы учитесь! Да, сообщения об ошибках не всегда самые лучшие, к сожалению. – Christoffer

+1

При использовании в позиции типа имя функции относится к прототипу функции. Это должно поддерживать классы стиля до ES6. –

Смежные вопросы