Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript flowtype似乎认为Object.keys输出总是一个字符串数组,即使它知道得更好_Javascript_Flowtype - Fatal编程技术网

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]语法: