我通过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)
}
}
游乐场