【问题标题】:How to typecheck polymorphic function in flow?如何在流中对多态函数进行类型检查?
【发布时间】:2018-10-31 00:23:00
【问题描述】:

我在 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)。这可能就是我不能将 return 转换为真实类型的原因。

此外,如果我将takeId 转换为以下类型(A => string) | (B => number),代码仍然不会进行类型检查;

如何使用 Flow 进行多态函数类型检查的返回,而不会失去安全性(例如没有 any)?

如果不可能,实现相同结果的惯用方式是什么(分解takeId)?

谢谢

【问题讨论】:

    标签: javascript flowtype


    【解决方案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
    

    希望对你有所帮助?

    【讨论】:

    • 非常感谢,这真的很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2015-02-08
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多