如何最好地处理属性设置为' SomeType[] | unknown ' ?



我通过API调用接收一些数据,其中一个属性被设置为SomeType[] | unknown,将其视为我的数据看起来像这样:

interface SomeType {
name: string
enabled: boolean
}
interface MyData {
id: string
name: string
someArrayProperties: SomeType[] | unknown
}

我有很多数组方法迭代someArrayProperties,所以像这样的多个实例:

const enabledProperty = myData.someArrayProperties.find((property: SomeType) => property.enabled)

我认为这应该很好,很容易解决,但我不断得到与unknown类型相关的错误,也设置在someArrayProperties

参数类型'(property: SomeType) =>布尔值'不能赋值给'类型的参数(value: unknown, index: number, obj: unknown[]) =>未知"。翻译:我期待(值:未知,索引:数字,obj:未知[])=>未知,但你传递了(属性:SomeType) =>布尔

解决这个问题的一种方法是总是设置(property as SomeType).enabled:
const enabledProperty = myData.someArrayProperties.find((property) => (property as SomeType).enabled)

或者设置(myData.someArrayProperties as SomeType[]).find:

const enabledProperty = (myData.someArrayProperties as SomeType[]).find((property) => property.enabled)

但这感觉像是一种逃避,没有适当地解决问题,更不用说这将不得不做很多。

无论如何,即使这在技术上修复了我得到的TS错误,如果有的话,我想知道一个更好的方法来处理它。

谢谢!

我建议使用类型保护符

function isSomeTypeArray(obj: MyData): obj is MyData & { someArrayProperties: SomeType[] } {
return Array.isArray(obj.someArrayProperties) 
&& obj.someArrayProperties.every(
(e) => typeof e.name === "string" && typeof e.enabled === "boolean"
)
}

类型保护检查对象的形状,以确定someArrayProperties字段是否真的包含SomeType类型的数组。

async function main(){
const data = await fetch("abc.com").then((data) => data.json()) as MyData
if (isSomeTypeArray(data)){
const enabledProperty = data.someArrayProperties.find((property) => property.enabled)
}
}

游乐场

相关内容

  • 没有找到相关文章

最新更新