I believe the simplest solution here is Partial:
type A = { b: string, c: number }
type Obj = Partial<A[]>
declare var apiData: Obj;
const check = apiData[0] // A | undefined
OR you can use typeguard
type A = { b: string, c: number }
type Obj = A[]
declare var apiData: Obj;
const isEmpty = <Elem,>(arg: Elem[]): arg is never[] => arg.length === 0
if (isEmpty(apiData)) {
const x = apiData[0] // never
} else {
const x = apiData[0] // A
}
Next type
type Obj = A[] | never[]
does not work as you might expect because never[] extends A[]
type IsAssignable = never[] extends A[] ? true : false // true
Also, you can use noUncheckedIndexedAccess flag
const b = apiData[0].adefinitely does error. Also you have a typo, itsA[] | [], notA[] || []