В процессе, как принять гетерогенный массив и вернуть этот массив

Когда у меня есть функция, которая принимает массив универсального типа и возвращает преобразованный массив, я могу написать:

function myfun<T>(input: Array<T>): Array<T> {}

Однако это терпит неудачу, если массив имеет гетерогенный тип, так как тогда T отличается от массива. Теперь, поскольку я знаю, что T всегда будет подтипом определенной базы: BaseTy и во время функции я использую только функции из /, которые работают с базовым типом, я мог бы написать:

function myfun(input: Array<BaseTy>): Array<BaseTy> {}

Однако проблема заключается в том, что фактический тип "потерян", и, таким образом, массив больше не является гетерогенным массивом производного типа.

Можно ли это исправить в потоке, не прибегая к небезопасным типам или any?

1 ответ

Решение

Вы захотите использовать ограниченный универсальный тип, чтобы указать минимальный тип, который может быть принят, и в то же время позволить функции возвращать более конкретный тип:

function myfun<T: BaseTy>(input: Array<T>): Array<T> {
    // whatever you want to do here
    return input
}

Пример полного кода:

type BaseType = {
    base: 'whatever'
}
type TypeA = BaseType & { a: 'Foo' }
type TypeB = BaseType & { b: 'Bar' }
type TypeC = BaseType & { c: 'Baz' }

function myfun<T: BaseType>(input: Array<T>): Array<T> {
    return input
}

const a = {
  base: 'whatever',
  a: 'Foo'
}

const b = {
  base: 'whatever',
  b: 'Bar'
}

const c = {
  base: 'whatever',
  c: 'Baz'
}


const aAndBs: Array<TypeA | TypeB> = [a, b]
const aAndCs: Array<TypeA | TypeC> = [a, c]

// Correct
const xs1: Array<TypeA | TypeB> = myfun(aAndBs)

// Error - It's actually returning Array<TypeA | TypeC>
const xs2: Array<TypeA | TypeB> = myfun(aAndCs)

( Попробуй)

Как сказал Джордан, вы можете изменить тип входного массива на $ReadOnlyArray если у вас возникнут проблемы с дисперсией:

function myfun<T: BaseType>(input: $ReadOnlyArray<T>): $ReadOnlyArray<T> {
    return input
}

Другие вопросы по тегам