这是我的代码:
type TEntity = Array<{ size?: number }>
const someVar: TEntity =
//@ts-ignore
getFromSomewhere()
function isNumber(input: any): input is number {
return !isNaN(Number(input))
}
const sizes1: number[] = someVar.map(entity => entity.size).filter(size => Number.isInteger(size));
const sizes2: number[] = someVar.map(entity => entity.size).filter(size => isNumber(size));
我原以为sizes
和sizes2
在过滤后会自动成为number[]
类型,但事实并非如此。将类型指定为: number[]
也是一个错误。我也尝试了lodash的isNumber
方法,但仍然没有成功。
我不想使用非null断言运算符(!
(,因为我在逻辑上过滤所有内容,并且我有linter来防止使用非null声明。
如何获得我想要的正确类型?
以下是TS游乐场的链接:https://www.typescriptlang.org/play?#code/C4TwDgpgBAKgogO2AS1FAvFAggJxwQxAB4BvKAZ2QC8IB+ALigQFcBbAIwhygF8A+AFACAxgHsE5YBVGsIANXw5G8JKhAYBULVADOgALBYAWmQBzBKJwRN2sxGAAxHDIDKMiAHcAFlwgAKAEohADNmBGEUcShkcgA5Nk4cf2QEMGZgRnwEEEDGVPSpWKZErigSWy1rYGYcBCgAQli4-Dj-BI4uFLSMWOOCeITEJKUoacBGRhZOnABtAF0MaVkFHAA6VnwwhVNHQ+KF2UUDXRiEC1kOQAG2Au84xDjS12IBAh7ZP O+gG4ROJJBRqBByAAmKalOaLTDkDyrDZbHZ7dQHI5os5gy7XO4PMFPGLxGH+P6Bf5AA
在这种情况下,使用(size) : size is number
将对您有所帮助。看看这个答案。
const sizes1: number[] = someVar.map(entity => entity.size).filter((size) : size is number => Number.isInteger(size));
const sizes2: number[] = someVar.map(entity => entity.size).filter((size) : size is number => isNumber(size));