Я пытаюсь написать несколько простых, функциональных примеров для оценки системы типа потока. Я пропускаю что-то очевидное, или если этот образец работы:Функция более высокого порядка, аннотации типа потока
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
. Особенно, повторение типов было бы утомительным для более сложных функций.
Любые идеи о том, как это сделать без явного повторения аннотаций типа?
Спасибо! Я полностью упустил ключевое слово 'typeof'. Должно быть, ты ослеп, так долго смотришь. Чем больше вы учитесь! Да, сообщения об ошибках не всегда самые лучшие, к сожалению. – Christoffer
При использовании в позиции типа имя функции относится к прототипу функции. Это должно поддерживать классы стиля до ES6. –