所以,我有以下代码,但是流错误不断出现。我试图抛出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'
}, {});
我已经离开了一些东西,但缓慢是相同的。 Flow正在将该条目读作返回元组类型。我尝试了各种各样的事情,但是没有把事情搞砸,我没有动过。
我似乎无法在这里注释破坏的项目([key,obj]),得到元组错误......
有关获取分配给var c的代码,使用注释等的任何帮助。?
我得到的错误: 无法在混合类型上调用方法(来自obj.func) 无法在元组等中赋值。
答案 0 :(得分:1)
错误是准确的。 Object.entries
has the type
entries(object:any):Array< [string,mixed]&gt ;;
无法知道元组中第二项的类型。这意味着你的代码
.map(([key, obj]) => obj.func(key) ? obj : false)
需要做
.map(([key, obj]) => {
if (typeof obj.func !== 'function') throw new Error();
return obj.func(key) ? obj : false;
})
以便流程知道它是一个函数。
或者,您可以更改数据结构以使用元组中第二项具有保证类型的类型,例如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'
}, {});
答案 1 :(得分:1)
就我而言,我有:
let objectsByName : { [string] : MyObjectType } = {}; //simple map
...
objectsByName[object.name] = object; //call repeatedly to populate map.
...
let results : any[] = []; //next we will populate this
尝试在Flow上像这样进行操作失败(尽管这是可执行的JavaScript):
for (let [name : string, object : MyObjectType] of Object.entries(objectsByName))
{
let result = doSomethingWith(object); //<- error on arg
results.push(result);
}
这对Flow成功了:
for (let name : string in objectsByName)
{
let object = objectsByName[name];
let result = doSomethingWith(object); //<- error on arg
results.push(result);
}
必须更改代码结构以适应像Flow comment types这样的所谓非侵入式系统,这很烦人,我之所以选择它,是为了使我的代码完全不了解Flow的存在。在这种情况下,我必须做一个例外,并按照 Flow 的要求构造我的代码。