【发布时间】:2019-10-17 18:20:56
【问题描述】:
我正在尝试基于具有相同键的另一个类型创建一个类型,并且其值的类型基于但不等于另一种类型。它类似于React 的setState,它接受一个值或一个获取当前值并返回新值的函数。
经过研究,与此错误相关的所有问题似乎都与缺少类型提示有关。我已经尝试为所有next、current 和newTheme[key] 变量指定类型。没用。
type Mode = "light" | "dark";
interface Theme {
mode: Mode;
test: number;
}
type ThemeUpdate = {
[K in keyof Theme]: Theme[K] | ((current: Theme[K]) => Theme[K])
};
const reducer = (currentTheme: Theme, action: Partial<ThemeUpdate>): Theme => {
const newTheme: Partial<Theme> = {};
(Object.keys(action) as (keyof Theme)[]).forEach((key: keyof Theme) => {
const next = action[key];
const current = currentTheme[key];
newTheme[key] = typeof next === "function" ? next(current) : next;
// ^^^^^^^
// Argument of type 'number | "light" | "dark"' is not assignable to parameter of type 'never'. Type 'number' is not assignable to type 'never'
});
return { ...currentTheme, ...newTheme };
};
我期望next 函数将根据当前键解析参数类型。相反,参数被解析为 never 类型,我收到错误消息:
类型参数'number | “光” | "dark"' 不可分配给 “从不”类型的参数。类型“数字”不可分配给类型 '从不'`
next 函数应该将current 参数推断为Mode,当key === "mode" 时,key === "test" 应该推断为number
【问题讨论】:
标签: typescript types