Javascript (编号|未定义)[]不可分配给编号[]
我对typescript中的类型有问题 所以我有一个som ID数组,我从一些复选框中得到。此数组也可能为空 可以从submit()返回的值示例: 因此,在本例中,id将是Ids=[1] 我尝试过几种解决方案,比如通过检查Ids是否未定义,尝试在上述代码块之后更改Ids的值: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[]类型,即使其为空 这里有一个解决方案,但我
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
},
[]
)