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