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/