Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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 (编号|未定义)[]不可分配给编号[]_Javascript_Arrays_Typescript_Array.prototype.map - Fatal编程技术网

Javascript (编号|未定义)[]不可分配给编号[]

Javascript (编号|未定义)[]不可分配给编号[],javascript,arrays,typescript,array.prototype.map,Javascript,Arrays,Typescript,Array.prototype.map,我对typescript中的类型有问题 所以我有一个som ID数组,我从一些复选框中得到。此数组也可能为空 可以从submit()返回的值示例: 因此,在本例中,id将是Ids=[1] 我尝试过几种解决方案,比如通过检查Ids是否未定义,尝试在上述代码块之后更改Ids的值: if (ids.length > 0){ ids = [] } 通过此代码,常量ID的类型为(Number | undefined)[],如何使其始终为Number[]类型,即使其为空 这里有一个解决方案,但我

我对typescript中的类型有问题

所以我有一个som ID数组,我从一些复选框中得到。此数组也可能为空

可以从submit()返回的值示例:

因此,在本例中,id将是Ids=[1]

我尝试过几种解决方案,比如通过检查Ids是否未定义,尝试在上述代码块之后更改Ids的值:

if (ids.length > 0){
  ids = []
}
通过此代码,常量ID的类型为(Number | undefined)[],如何使其始终为Number[]类型,即使其为空

这里有一个解决方案,但我一点也不喜欢:

const Ids: number[] = Object.values(submit()!)
  .map(formfield => {
    if (formfield.value === 'true') {
      return Number(formfield.id);
    } else {
      return 0;
    }
  })
  .filter(id => id != 0);
在我的例子中,formfield.id永远不会有值0,因此可以过滤值为0的所有元素。所以我不推荐这个解决方案。但是,嘿,它起作用了,对吗?¯\_(ツ)_/“

尝试添加:

    if (formfield.value === 'true') {
      return Number(formfield.id);
    }
    return null;
在if中的返回项下

完整代码:

const Ids: number[] = Object.values(submit()!)
  .map(formfield => {
    if (formfield.value === 'true') {
      return Number(formfield.id);
    }
    return null;
  })
  .filter(id => id != undefined);
编辑:

检查一个变量是否未定义的更好方法是使用
typeof
运算符:

typeof id !== 'undefined'

我不能直接回答你的问题,但请允许我提出一种不同的方法:

const ids = Object.keys( obj || {} )
      .reduce( function(acc,cur) {
                   if( obj[cur] ) acc.push(cur);
                   return acc
                },
                []
              )
听起来你想从你的对象中提取一部分值。这将返回真实的键。而不是
acc.push(cur)
你想推的是
Number(formfield.id)
。顶部的
obj |{}
允许“obj”被
未定义
这个问题 主要问题是
.filter()
签名。它将始终返回与开始时相同类型的数组。TypeScript编译器不可能保证任何其他内容。以下是一个示例:

const arr/*:(字符串|数字)*/=[“一”,二,三,“四”,五,六];
常数number/*:number[]*/=arr.filter(x=>typeof x==“number”);

console.log(numbers);
问题是
.filter
无法更改数组的类型。这是有意义的,比如说,您有
arr=[1,2,“a”,“b”,“3]
这是
(number | string)[
。如果您这样做
arr.filter(x=>x!=“a”)
,则与
arr.filter(x=>typeof x==a)的操作(签名方式)相同“number”)
。TS无法推断一个筛选器将生成
number[]
,而另一个不会。它需要检查代码,并且可能能够进行比这更高级的分析。什么是
submit()
?submit()是我创建的函数,它从窗体返回值。在本例中,它从复选框返回所有值:)0的大小写如何?是否也要将其过滤掉?感谢您的回答!这会将类型更改为(number | null)[]是的,这在严格的编译器选项中仍然不起作用。它只在您接受
null
作为
number
的成员(在松散的编译器检查中)时起作用,但我认为这不可取。您能给我们提交()中的数据数组吗?为了做一些测试。编辑问题来做。@aepifano这很容易测试。我已经删除了一些不相关的细节。重要的是它正在处理一个类型数组,然后转换它们。
Object.values
不需要查看打字。我编辑问题是为了有一个响应示例Ethak!这是一个完美的解决方案。你的解释非常清楚:)
const ids = Object.keys( obj || {} )
      .reduce( function(acc,cur) {
                   if( obj[cur] ) acc.push(cur);
                   return acc
                },
                []
              )