Как проверить полиморфную функцию в потоке?

У меня проблемы с полиморфными функциями в 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

надеюсь, это поможет

Другие вопросы по тегам