К сожалению, это базовая «особенность» «Массивов», и она работает так, как задумано, индексирование массива по определенному индексу всегда приведет к тому типу Массивов, даже если этот тип является объединением.
Этотакже всегда будет выдавать тип Arrays независимо от того, какое значение имеет этот индекс,
Индексировать можно только по кортежу по ключу, чтобы получить тип по этому ключу, и это потому, что они имеют длину, известную во время выполнения где-какМассивы этого не делают.
Возьмем следующий код в качестве примера.
const testTuple: [AElement, CElement, ZElement] = [{
name: "a",
propA: "123",
},{
name: "c",
propC: "321",
},{
name: "z",
propZ: "123",
propZZ: 123,
}];
const TestTypeAtIndex = testTuple[0] // AElement and not a union.
Существует множество обходных путей, если вы хотите узнать больше, оставьте комментарий, но я бы сказал, что самый простойпросто чтобы добавить определяемый пользователем типгард, более сложные обходные пути обеспечивают лучшее качество жизни с более сложной реализацией.
// use it as array.
const testTuple: Elem[] = [{
name: "a",
propA: "123",
},{
name: "c",
propC: "321",
},{
name: "z",
propZ: "123",
propZZ: 123,
}];
const isAElement = (ele: ElementsMap[keyof ElementsMap]): ele is AElement => {
return "propA" in ele;
}
const testTypeAtIndex = testTuple[0] // union of everything
if(isAElement(testTypeAtIndex)) {
const newTestType = testTypeAtIndex; // inside here its JUST AElement because of typeguard.
}