Как проверить полиморфную функцию в потоке?
У меня проблемы с полиморфными функциями в Flow.
type A = { id: string };
type B = { id: number };
function takeId(x) {
return x.id;
}
const a: A = { id: 'akn2' };
const b: B = { id: 14 };
(takeId(a) : string);
// Error
(takeId(b) : number);
// Error
Я понимаю, что обработчик потока будет вводить полиморфную функцию в соответствии с контекстом и местом их вызова.
В этом случае я считаю, что takeId
будет иметь следующий тип: (A|B) => (string | number)
, Наверное, поэтому я не могу привести возвращение к его реальному типу.
Кроме того, код все еще не проверяет тип, если я приведу takeId
со следующим типом (A => string) | (B => number)
;
Как сделать так, чтобы возвращение полиморфной функции проверялось с помощью Flow, без потери безопасности (нет any
например)?
Если это невозможно, то каким был бы нелепый способ достижения того же результата (takeId
)
Спасибо
1 ответ
Проблема в вашем примере заключается в том, что Flow не может уточнить тип возвращаемого значения, поскольку он не знает, как тип вывода соотносится с типом ввода. Вы можете сделать что-то подобное, чтобы выразить эти отношения:
type A = { id: string };
type B = { id: number };
type Entity<I> = { id: I };
function takeId<T>(x: Entity<T>): T {
return x.id;
}
const a: A = { id: 'akn2' };
const b: B = { id: 14 };
(takeId(a) : string);
// OK
(takeId(b) : number);
// OK
надеюсь, это поможет