type GenericElement<T> = {
set: Setter<T>;
state: T;
}
type Setter<T> = (state: T) => void
type GenericElements = Array< GenericElement<string> | GenericElement<number>>
const genericElements = [{
set: (state: string) => console.log(state),
state: 'stateValue'
}, {
set: (state: number) => console.log(state),
state: 123
}]
genericElements.map(({set, state}) => set(state))
// ---------------------------------------|
/**
* Argument of type 'string | number' is not assignable to parameter of type 'never'.
* Type 'string' is not assignable to type 'never'.(2345)
*/
Example on TS детская площадка
Возможно ли реализовать это без этой проблемы, или как сделать так, чтобы предложенная структура могла обрабатывать ее set(state)
обычным способом без шаблонов, таких как выполнение этой операции для каждого дочернего элемента вручную или перекодирование, такое как [() => set1(state1), () => setN(stateN)]
?
Array<Foo<string>|Foo<number>>
в итоге получилось быArray<FooExistentiallyQuantified>
. Это действительно работает, если у вас естьFoo<string>|Foo<number>
? Кажется, что он не может использоватьexistentialize
-подобный nat trafo внутриmap
, поэтому приходится приводитьFoo<string>|Foo<number>
к чему-то вродеFoo<any>
, и в этот момент вся предыдущая конструкция кажется ненужной. Есть ли лучшие решения? - person Andrey Tyukin   schedule 16.07.2020Array<Foo<string>|Foo<number>>
. Я думаю, что нам в основном нужен способ сказать, что, поскольку одна и та же функция проверяет типы в обеих ветвях, она должна проверять тип в объединении. Прямо сейчас компилятор разрушает корреляцию междуset
иstate
. Близкое голосование отслежено. - person HTNW   schedule 16.07.2020