基于键的流对象值

问题描述 投票:0回答:1

使用flow时,我一直想输入这样的东西:

type Item = {
  timestamp: number,
  status: { completed: boolean },
  data: string,
}

type Filter = {
  timestamp: number,
  status: { completed: boolean },
}

const FilterFns: {
  [key: $Keys<Filter>]: ($ElementType<Filter, key>, item: Item) => boolean
} = {
  timestamp: (timestamp, item) => timestamp === item.timestamp,
  status: (status, item) => status.completed === item.status.completed,
}

但我得到错误:

13:   [key: $Keys<Filter>]: ($ElementType<Filter, key>, item: Item) => boolean
                                                  ^ Cannot resolve name `key`.

相反,我将FilterFns定义为:

const FilterFns: {
  [key: $Keys<Filter>]: ($Values<Filter>, item: Item) => boolean
} = {
  timestamp: (timestamp, item) => timestamp === item.timestamp,
  status: (status, item) => status.completed === item.status.completed,
}

我收到错误:

16:   status: (status, item) => status.completed === item.status.completed,
                                       ^ Cannot get `status.completed` because property `completed` is missing in `Number` [1].
References:
8:   timestamp: number,
                ^ [1]

确保在FilterFns值中传递给函数的第一个参数是Filter中相应类型的正确方法是什么?

javascript flowtype
1个回答
1
投票

不是对象键问题的一般解决方案,但是可以通过下一种方式解决特定情况

type Item = {
  timestamp: number,
  status: { completed: boolean },
  data: string,
}

type Filter = {
  timestamp: number,
  status: { completed: boolean },
}

const FilterFns: {
  [key: $Keys<Filter>]: ($Values<Filter>, item: Item) => boolean
} = {
  timestamp: (timestamp, item) => timestamp === item.timestamp,
  status: (status, item) => typeof status === 'object' && status.completed === item.status.completed,
}

添加额外的条件typeof status === 'object'将允许流程识别它现在究竟是什么值,否则流量不会得到对键 - 值不对,不幸的是

© www.soinside.com 2019 - 2024. All rights reserved.