typescript - 是否可以在没有 "is not assignable to parameter of type ' never'"错误的情况下使用具有不同联合类型的数组元素?

标签 typescript generics types existential-type union-types

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)
*/

关于 TS playground 的示例

是否有可能在没有这个问题的情况下实现它,或者如何引导建议的结构能够以通用方式处理它 set(state) 而没有样板文件,例如手动为每个 child 执行此操作或像 [() => set1(state1), () => setN(stateN)]?

这样的过度编码

最佳答案

经过不断的摸索,我找到了适合自己的方法。

链接到 TS playground玩。

enum genericTypes {
    stringTypes = 'stringTypes',
    numberTypes = 'numberTypes',
}
const {numberTypes, stringTypes} = genericTypes;

type GenericElement<T extends genericTypes> = {
    set: Setter<T>;
    state: State<T>;
};

type State<T extends genericTypes> = T extends genericTypes.numberTypes ? number : string;

type States = {
    [numberTypes]: State<genericTypes.numberTypes>;
    [stringTypes]: State<genericTypes.stringTypes>;
};

type Setter<T extends genericTypes> = (state: State<T>) => void;

type Setters = {
    [numberTypes]: Setter<genericTypes.numberTypes>;
    [stringTypes]: Setter<genericTypes.stringTypes>;
};

const setters: Setters = {
    [numberTypes]: (state: State<genericTypes.numberTypes>) => console.log(state),
    [stringTypes]: (state: State<genericTypes.stringTypes>) => console.log(state),
};

const states: States = {
    [numberTypes]: 123,
    [stringTypes]: '123',
};

type GenericElements = Array<GenericElement<genericTypes>>;

const genericElements: GenericElements = [
    { set: setters.numberTypes, state: states.numberTypes },
    { set: setters.stringTypes, state: states.stringTypes },
];

genericElements.map(({ set, state }) => set(state));

我将继续调查以最终了解。如果有人可以通过反馈审阅该提案,我将不胜感激。

关于typescript - 是否可以在没有 "is not assignable to parameter of type ' never'"错误的情况下使用具有不同联合类型的数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62916752/

相关文章:

javascript - 为什么 RequireJs 传递的是 Null?

node.js - axios 请求错误 : connect ECONNREFUSED

c# - 通过 C# 中的反射获取 'basic' 数据类型而不是奇怪的可空数据类型

c++ - 在构造函数中使用可变参数初始化 std::tuple

javascript - Angular 8 使用 ngIf 和异步管道来显示和隐藏 HTML 元素

javascript - SendGrid 不发送邮件,但不抛出任何错误

Java、静态方法绑定(bind)和泛型都包含一些方法重载

java - java中泛型类型的子类型

通用 curry 函数的 typescript 类型

haskell - 如何在不使用混合列表的情况下实现此功能?