类型 'any' 不能分配给类型 'never' 当试图用变量设置对象 属性 时,变量是 ObjectType 的键

Type 'any' is not assignable to type 'never' when trying to set Object property with variable which is keyof ObjectType

在下面的代码中,typscript 编译器在更新方法中显示错误,表示 'any' 不可分配给类型 'never'。我注意到当类型包含与其他类型混合的布尔值时,keyof 类型不起作用。我怎样才能使它在类型中具有混合类型值进行编译?

type ConfigState = {
  isAdminSet: boolean;
  isDatabaseConnected: boolean;
  adminName: string;
};

export class ConfigManager {
  state: ConfigState = {
    isAdminSet: false,
    isDatabaseConnected: false,
    adminName: "",
  };

  update(key: keyof ConfigState, value: ConfigState[keyof ConfigState]) {
    this.state[key] = value;
  }
}

但是这个编译:

type ConfigState = {
  isAdminSet: boolean;
  isDatabaseConnected: boolean;
};

export class ConfigManager {
  state: ConfigState = {
    isAdminSet: false,
    isDatabaseConnected: false,
  };

  update(key: keyof ConfigState, value: ConfigState[keyof ConfigState]) {
    this.state[key] = value;
  }
}

TLDR:TypeScript 不知道您的 value 是否适合 state 的所选 属性。

在您的第一个示例中,所有属性都是 boolean,因此 any 被推断为 boolean。但是一旦添加了其他类型(这里是 string),不限制 key 就无法推断出 any。因此,它被推断为 never,并且您不能将 any 分配给 never

在这种情况下,您必须(我认为)为此使用泛型。此外,这将确保类型安全。

看看这部分 TS 文档:https://www.typescriptlang.org/docs/handbook/2/generics.html#using-type-parameters-in-generic-constraints

type ConfigState = {
  isAdminSet: boolean;
  isDatabaseConnected: boolean;
  adminName: string;
};

export class ConfigManager {
  state: ConfigState = {
    isAdminSet: false,
    isDatabaseConnected: false,
    adminName: "",
  };

  update<Key extends keyof ConfigState>(key: Key, value: ConfigState[Key]) {
    this.state[key] = value;
  }
}