【问题标题】:ObjMap return value or functionObjMap 返回值或函数
【发布时间】:2021-02-07 02:14:37
【问题描述】:

我不明白为什么这不起作用。我希望 $ObjMap 要求对象返回该值,或返回该值的函数。请参阅代码中的注释。有谁知道如何进行这项工作?

type TObj = {|
  a: number,
  b: string,
  c: boolean,
|};

type Extract = <V>(V) => (() => V) | V

type TType = $ObjMap<TObj, Extract>

function a (): string {
  return 'a';
}

// Expect a to have an error as it is a function that returns a string.
// $ObjMap states that it must be either a number, or a function that returns 
// a number.
const t: TType = {
  a,
  b: 'v',
  c: true,
};

https://flow.org/try/#0C4TwDgpgBAKg8gIwFZQLxQN4B8BQUoCGAXFAHYCuAtghAE4A0eUCJAzsLQJakDmj+AYxIIA9iIA2EAqUZYAvgG4cOUJCgBRAB4cCA4GigAeAGoA+ABTGAlGlNRz5m6jvWoWKMeWroMGOGjoACSISACyBGCG8Mj0Gtq0usCmygBm5KR6nCKkhPZWbBzcPJhMtBDA5LQ5AOQE1UpyygLZ7FDAJL7+BhhMxIT8zCTVAG7VA0JttOQQjIpAA

【问题讨论】:

    标签: javascript flowtype


    【解决方案1】:

    在我看来,这似乎是实现中的限制/错误。原因如下:

    如果我们更改 Extract 使其仅期望原语,我们通过观察一切都按预期工作来建立基线。

    type Extract = <V>(V) => V
    
    19:   a: a,
             ^ Cannot assign object literal to `t` because function [1] is incompatible with number [2] in property `a`. [incompatible-type]
        References:
        11: function a (): string {
            ^ [1]
        2:   a: number,
                ^ [2]
    

    接下来我们修改Extract,使其仅接受返回类型为数字或相应预期值的函数。

    type Extract = <V>(V) => ((() => number) | V)
    

    现在我们观察到您的预期行为,a 上的错误

    19:   a: a,
             ^ Cannot assign object literal to `t` because string [1] is incompatible with number [2] in the return value of property `a`. [incompatible-type]
        References:
        11: function a (): string {
                           ^ [1]
        7: type Extract = <V>(V) => ((() => number) | V)
                                            ^ [2]
    

    但是,如果我们将接受的类型从 number 更改为 string,错误就会消失,这意味着到目前为止一切正常。

    最后,当我们用V 替换number 时,错误消失了。这让我觉得解释器在解决问题时遇到了问题,默认使用any

    我预计静态分析会出现这样的问题,它被称为静态是有原因的。

    免责声明:我上面所说的一切都只是想法和假设,我发布的目的是为了提供帮助,并且可能完全是垃圾,在这种情况下,我深表歉意。

    【讨论】:

    • 我认为你是对的。我在 flow repo 中提交了一个错误。
    • @pizzarob 我的一般假设是,因为这发生在 vscode 的智能感知中 - 每当输入错误时,它会回退到 any,它的工作方式相同。 V 很可能不是您在提供的可调用类型中认为的那样,它可能没有定义。因此,我认为值得注意的是,可能有某种 special 语法允许您将 V 导入可调用类型,但我不熟悉 flow。
    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 2018-12-17
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多