В процессе, как принять гетерогенный массив и вернуть этот массив
Когда у меня есть функция, которая принимает массив универсального типа и возвращает преобразованный массив, я могу написать:
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
}