使用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
中相应类型的正确方法是什么?
不是对象键问题的一般解决方案,但是可以通过下一种方式解决特定情况
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'
将允许流程识别它现在究竟是什么值,否则流量不会得到对键 - 值不对,不幸的是