TypeScript处理类型数组或单个值
我有一个这样的界面。我想知道处理这个案子最好的办法是什么:TypeScript处理类型数组或单个值,typescript,Typescript,我有一个这样的界面。我想知道处理这个案子最好的办法是什么: interface Ia { a: string } let a: Ia | Ia[] console.log(a[0].a) TS向我抛出了一个错误: Element implicitly has an 'any' type because expression of type '0' can't be used to index type 'Ia'. Property '0' does not exist on type
interface Ia {
a: string
}
let a: Ia | Ia[]
console.log(a[0].a)
TS向我抛出了一个错误:
Element implicitly has an 'any' type because expression of type '0' can't be used to index type 'Ia'.
Property '0' does not exist on type 'Ia'.
我知道我可以使用console.log((作为Ia[])[0].a)
,但它根本不可读。有人有更好的建议吗
此外,实际用例类型内部有许多属性,而不是像示例中那样的单个
a:sting
。如果a
不是数组,那么a[0]
就没有意义。您需要测试它是否是一个数组,并根据测试结果对其进行不同的处理
接口Ia{
a:字符串
}
让obj:Ia | Ia[]={a:'foo'};
功能测试(obj:Ia | Ia[]):无效{
console.log(Array.isArray(obj)?obj[0].a:obj.a);
}
或者您可以使用此模式,它利用了控制流类型缩小的优势:
功能测试2(obj:Ia | Ia[]):无效{
if(Array.isArray(obj)){obj=obj[0];}
//现在obj:Ia不是一个数组
控制台日志(obj.a);
}
如果
a
不是数组,那么a[0]
就没有意义。您需要测试它是否是一个数组,并根据测试结果对其进行不同的处理
接口Ia{
a:字符串
}
让obj:Ia | Ia[]={a:'foo'};
功能测试(obj:Ia | Ia[]):无效{
console.log(Array.isArray(obj)?obj[0].a:obj.a);
}
或者您可以使用此模式,它利用了控制流类型缩小的优势:
功能测试2(obj:Ia | Ia[]):无效{
if(Array.isArray(obj)){obj=obj[0];}
//现在obj:Ia不是一个数组
控制台日志(obj.a);
}
我建议为此创建一个getter,请考虑:
const getA = (x: Ia | Ia[]) => "a" in x ? x.a : x[0]?.a;
const a = getA({ a: 'I am a' });
const a2 = getA([{ a: 'I am also a ' }]);
或统一类型,并始终以相同的方式使用:
const uniform = (x: Ia | Ia[]): Ia => Array.isArray(a) ? a[0] : a;
这样的函数将我们的类型从联盟统一到一个成员。我建议为此创建一个getter,请考虑:
const getA = (x: Ia | Ia[]) => "a" in x ? x.a : x[0]?.a;
const a = getA({ a: 'I am a' });
const a2 = getA([{ a: 'I am also a ' }]);
或统一类型,并始终以相同的方式使用:
const uniform = (x: Ia | Ia[]): Ia => Array.isArray(a) ? a[0] : a;
这样的功能将我们的类型从工会统一为一个成员。我已与以下各方达成一致:
interface Ia {
a: string
}
let a: Ia | Ia[]
if (Array.isArray(a)){
a = [a]
}
console.log(a[0].a)
感谢@kaya3和@maciej sikora为我提供的建议我已与:
interface Ia {
a: string
}
let a: Ia | Ia[]
if (Array.isArray(a)){
a = [a]
}
console.log(a[0].a)
谢谢@kaya3和@maciej sikora的建议如果你知道
a
是一个数组,为什么你说它是Ia | Ia[]
?@MaciejSikora我得到了数据结构,它可能是一个列表或一个值。我将对此进行检查,但我的问题是关于处理实际类型分配的选项,以及检查是否有替代as
的选项如果您知道a
是一个数组,那么为什么您会说它是Ia | Ia[]
?@MaciejSikora我正在获取数据结构,它可能是一个列表或单个值。我将对此进行检查,但我的问题是关于处理实际类型分配的选项,以及检查是否有任何替代as