所以,我有以下代码,但流程错误不断弹出。我试过投射 Object.entries,但不起作用 - 其他东西。任何见解?
type Fields = {
name: string,
func: (*) => boolean
};
type S = {
key1: Fields,
bill: Fields
}
var a: S = {
key1: {name: 'mary', func: (str) => str === 'mary'},
bill: {name: 'bill', func: (str) => str === 'bill'}
}
var c = Object
.entries(a)
.map(([key, obj]) => obj.func(key) ? obj : false)
.filter(f => f)
.reduce((acc, c) => {
return 'something here'
}, {});
Run Code Online (Sandbox Code Playgroud)
我已经省略了一些东西,但速度是一样的。Flow 正在读取这些条目作为返回元组类型。我尝试了各种各样的事情,但我没有把事情搞砸,而是保持原样。
我似乎无法在这里注释解构的项目 ([key, obj]),得到元组错误...
将代码分配给 var c、使用注释等有什么帮助吗?
我得到的错误:无法调用混合类型的方法(来自 obj.func)无法在元组等中分配值。
错误是准确的。Object.entries有类型
条目(对象:任何):数组<[字符串,混合]>;
它无法知道元组中第二项的类型是什么。这意味着你的代码
.map(([key, obj]) => obj.func(key) ? obj : false)
Run Code Online (Sandbox Code Playgroud)
需要做
.map(([key, obj]) => {
if (typeof obj.func !== 'function') throw new Error();
return obj.func(key) ? obj : false;
})
Run Code Online (Sandbox Code Playgroud)
这样 flow 就知道它肯定是一个函数。
或者,您可以更改数据结构以使用元组中第二项具有保证类型的类型Map,例如
type Fields = {
name: string,
func: (string) => boolean
};
type S = Map<string, Fields>;
var a: S = new Map([
['key1', {name: 'mary', func: (str) => str === 'mary'}],
['bill', {name: 'bill', func: (str) => str === 'bill'}],
]);
var c = Array.from(a, ([key, obj]) => obj.func(key) ? obj : false)
.filter(f => f)
.reduce((acc, c) => {
return 'something here'
}, {});
Run Code Online (Sandbox Code Playgroud)