首页 > 解决方案 > Flow:在 map/filter/reduce 期间保留类型

问题描述

如何在正确推断键类型的同时过滤/减少类型对象?例如:

/* @flow */
type A = {
  a0?: string,
  a1?: boolean,
  a2?: number
}
type B = {
  b0?: string,
  b1?: boolean,
  b2?: number
}
type AB = A & B

const keysA = ['a0', 'a1', 'a2']

// Given an AB object, keep only the keys that belong in type A
function keepA(ab: AB):A {
  return keysA
    .filter(prop => ab.hasOwnProperty(prop))
    .reduce((obj, prop) => {
      obj[prop] = ab[prop]
      return obj
    }, {} )
}

function flowTest(ab: AB) {
  const a = keepA(ab)
  return a
}

这会引发错误:

obj[prop] = ab[prop]                     
            ^ Cannot return `keysA.filter(...).reduce(...)` 
              because boolean [1] is incompatible with 
              string [2] in property `a0`.
References:
4:   a1?: boolean,
          ^ [1]
3:   a0?: string,
          ^ [2]

似乎在 assignmentobj[prop] = ab[prop]中,flow 认为右侧可能是string | boolean | number.

它在 flow.org/try 上:

https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoALgTwA4FMwCCYAvGAN6phgCGADAPwBcYAzugE4CWAdgOYA0lGgEYmYAEZw4MXNW6Cq1AExjuAVwC243O1QBfDDnwAhEuSHiGzNlz4KJo5pOmz5Flc3Vad+w3kKmpEQAZGDGqKgAxnDcbGAA1riYLESkANoA5HQZ-GBZwjl5yhkAuhHAwGAA4pwAbrjcNI0EpnDiAFa4kei5ibjYYDEwmGDoABb4icmjY9ToErjwfGA8o0aEqFBq3N2cMQm4-QQAFNTizC0AlIxEFFTsuOhq7I1TKUJUAHRQnDDoOsdsOw4ANiAA+GjiT6zFgAeQQ3AACsC8OwsICUZdLh8wJ8HgATNSRXDHY5tdq5IEgy4kCF3KgM8lpKnYEpmM7MlFlBkMh5PF6DDo4vS5Mh6MDYgybba7fawRAAFVwbFO5wCNPp0Vi82oZj62BOZ2x90ez0a1F8QA

我对 Flow 很陌生(以及一般的类型检查)。

标签: ecmascript-6flowtype

解决方案


推荐阅读