You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript疑难:'any'类型无法赋值给'never'类型排查

TypeScript报错:Type 'any' is not assignable to type 'never' 根源与解决

问题根源

这个错误的核心是类型不兼容导致的类型收窄过严:

  • 你定义的ValueOfTileSettings是TileSettings所有属性值的联合类型,其中包含了带有"None"值的TileType;
  • 当key为tileLayout时,对应的属性类型是TileLayout | undefined,但TileLayout仅包含"STANDARD"和"COMPACT",不接受"None";
  • TypeScript检查赋值时发现,value可能是"None"(来自TileType的可选值),无法赋值给tileLayout,于是将themeToChange[tileId][key]的类型推断为never(没有任何类型能兼容所有可能的value),最终抛出错误。

你添加"None"到TileLayout后,"None"可以合法赋值给tileLayout,类型冲突消失,错误自然就没了。

解决方案

方案1:用泛型严格匹配key和value类型(推荐)

修改changeSetting函数为泛型函数,让value的类型和当前key对应的属性类型严格绑定,彻底避免类型不兼容:

const changeSetting = React.useCallback(
  <K extends keyof TileSettings>(key: K, value: TileSettings[K], tileId: TileId) => {
    const userSettings = JSON.parse(JSON.stringify(settings)) as UserSettings;
    const themeToChange = getCurrentTheme(userSettings, colorMode);

    themeToChange[tileId][key] = value;

    setSettings(userSettings);
  },
  [colorMode, setSettings, settings]
);

这样TypeScript会在编译时确保每个key对应的value类型完全匹配,不会再出现跨类型赋值的问题。

方案2:调整TileLayout类型(业务允许时)

如果你的业务逻辑允许tileLayout取值为"None",直接把"None"加入TileLayout类型定义即可:

export type TileLayout = "STANDARD" | "COMPACT" | "None";

这个方案最简单,但要确认业务上是否合理。

方案3:类型断言(不推荐)

如果以上两种方案都无法实施,可以用类型断言绕过TypeScript的检查,但这会失去类型安全保障,可能隐藏潜在问题:

themeToChange[tileId][key] = value as never;

内容的提问来源于stack exchange,提问作者allig256

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:55:17