gpt4 book ai didi

typescript - 类型 'any' 不能分配给类型 'never' 试图用变量设置 Object 属性时 keyof ObjectType

转载 作者:行者123 更新时间:2023-12-02 01:53:20 30 4
gpt4 key购买 nike

在下面的代码中,typscript 编译器在更新方法中显示错误,表示“any”不能分配给类型“never”。我注意到当类型包含与其他类型混合的 bool 值时,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;
}
}

关于typescript - 类型 'any' 不能分配给类型 'never' 试图用变量设置 Object 属性时 keyof ObjectType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69917159/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com