Javascript flowtype似乎认为Object.keys输出总是一个字符串数组,即使它知道得更好
示例代码:Javascript flowtype似乎认为Object.keys输出总是一个字符串数组,即使它知道得更好,javascript,flowtype,Javascript,Flowtype,示例代码: /* @flow */ type Key = 'a' | 'b'; const obj: {[key: Key]: number} = { a: 1, b: 2, }; const keys = Object.keys(obj); const val = obj[keys[0]]; 其中: 所以它认为keys是string[]而不是Key[],这在我看来是错误的。除了将obj的类型更改为{[key:string]:number}之外,我还有什么办法解决这个问题吗?流
/* @flow */
type Key = 'a' | 'b';
const obj: {[key: Key]: number} = {
a: 1,
b: 2,
};
const keys = Object.keys(obj);
const val = obj[keys[0]];
其中:
所以它认为
keys
是string[]
而不是Key[]
,这在我看来是错误的。除了将obj
的类型更改为{[key:string]:number}
之外,我还有什么办法解决这个问题吗?流会引发错误,因为数组
是不变的(请参阅)。这可以通过定义自己的键
函数来解决
function keys<T: string>(obj: any): Array<T> {
return Object.keys(obj)
}
功能键(obj:any):数组{
返回Object.keys(obj)
}
流引发错误,因为数组
是不变的(请参阅)。这可以通过定义自己的键
函数来解决
function keys<T: string>(obj: any): Array<T> {
return Object.keys(obj)
}
功能键(obj:any):数组{
返回Object.keys(obj)
}
以下是一个示例,它证明了流程是正确的:
type Key = 'a' | 'b';
const obj1 = {
a: 1,
b: 2,
c: 3
};
const obj2: { a: number, b: number } = obj1;
const obj: {[key: Key]: number} = obj2;
const keys = Object.keys(obj); // this will be ['a', 'b', 'c']
const val = obj[keys[0]];
下面是一个示例,它证明了Flow是正确的:
type Key = 'a' | 'b';
const obj1 = {
a: 1,
b: 2,
c: 3
};
const obj2: { a: number, b: number } = obj1;
const obj: {[key: Key]: number} = obj2;
const keys = Object.keys(obj); // this will be ['a', 'b', 'c']
const val = obj[keys[0]];
有趣。既然obj1
有一个属性c
,为什么obj2
的第一个赋值没有错误呢?因为{a:number,b:number,c:number}
是{a:number,b:number}
的一个子类型,有没有办法防止这种情况发生,比如我想让一个对象只有特定的键?啊,我在文档中看到,如果我将obj定义为{| a:number,b:number |},它确实可以工作,但我似乎无法让它使用[key:key]语法:有趣。既然obj1
有一个属性c
,为什么obj2
的第一个赋值没有错误呢?因为{a:number,b:number,c:number}
是{a:number,b:number}
的一个子类型,有没有办法防止这种情况发生,比如我想让一个对象只有特定的键?啊,我在文档中看到,如果我将obj定义为{| a:number,b:number |},它确实可以工作,但我似乎无法让它使用[key:key]语法: