如何使用 keyof 类型定义修复 "Argument of type 'string' is not assignable to parameter of type 'never'"

How to fix "Argument of type 'string' is not assignable to parameter of type 'never'" with use of keyof type definition

我正在使用中央 Redux 存储并输入以下操作:

setProperty: <AppState, K extends keyof AppState>(
      key: K,
      value: AppState[K]
    ): void => {
      set({
        [key]: value,
      });
    }

AppState 如下:

type AppState = {
loading: boolean;
error: string;
data: DataDTO;
};

因此该操作采用键(必须是在 AppState 类型中定义的键),并采用值参数,这是 AppState 各个键的类型定义之一。所以key只能是loading、error和data,而value参数只能是boolean、string或DataDTO类型。

但是,当我使用 setProperty 操作时:

  setProperty(
    'data',
    computedData
  );

Typescript 为“数据”字符串触发错误,表示:

Argument of type 'string' is not assignable to parameter of type 'never'

它说不需要类型,我给了它一个字符串,所以它抛出了一个错误。我怎样才能解决这个问题并让它与打字稿很好地配合使用?

感谢您的帮助!

问题就在这里:

    setProperty: <AppState, K extends keyof AppState>(
      key: K,
      value: AppState[K]
    ): void => {
      set({
        [key]: value,
      });
    }

第一个通用参数 AppState 隐藏现有类型 AppState。因为 TypeScript 在您调用它时无法推断出此泛型参数是什么,所以 keyof AppState 永远不会。

所以要解决它,只需完全删除它:

    setProperty: <K extends keyof AppState>(
      key: K,
      value: AppState[K]
    ): void => {
      set({
        [key]: value,
      });
    }

Playground