gpt4 book ai didi

typescript - 如何使用嵌套接口(interface)限定 TypeScript 泛型类型的范围

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:37 32 4
gpt4 key购买 nike

我正在尝试为接受三个参数的函数创建一个通用接口(interface)。填写第一个参数时,第二个参数的选项应该在第一个参数的范围内。第三个参数应该在第二个参数的范围内。

我当前的代码如下所示:

type SettingActionCreator<T> = <
L extends T,
K extends keyof L,
C extends keyof L[K]
>(
type: K,
settingKey: keyof L[K],
settingValue: L[K][C]
)

export interface SomeSettings {
[Type.TypeA]: {
settingA: "value1" | "value2";
settingB: "value3 | "value4";
};
[Type.TypeB]: {
...
};
[Type.TypeC]: {
...
};
}

const setSomeSetting: SettingActionCreator<SomeSettings> = (
type,
settingKey,
settingValue
) =>
// do something

因此,当我想用​​参数调用 setSomeSetting 时,我希望我传入的每个参数的作用域都变小。

例如,如果我填写第一个参数,那么 SettingActionCreator 会确保第二个参数 (settingKey) 只能是 settingAsettingB。到目前为止,一切都按预期进行。

setSomeSetting(Type.TypeA, ....) // <-- settingKey accepts "settingA" and "settingB"

但是对于第三个参数我似乎无法解决。当我设置第一个参数和第二个参数时,我希望第三个参数只接受所选 settingKey 参数中的联合选项。但是我没有得到 Type.TypeA 中的所有选项。所以 settingAsettingB

的 settingValues

使用这段代码:

setSomeSetting(Type.TypeA, "settingA", "value3") // <-- settingValue should only accept "value1" or "value2"

我希望出现如下错误:

TS2345: Argument of type '"value3"' is not assignable to parameter of type `"value1" | "value2"

但是我没有收到类型错误,因为它同时接受 settingAsettingB 的值。

有人对我做错了什么有建议吗?

最佳答案

您需要向 TypeScript 证明 settingKeysettingValue 相关 - 您声明中的 settingKey: keyof L[K]正在混淆它(我不确定为什么 - 它感觉type C extends keyof L[K] != keyof L[K] 的错误,但它绝对是类型推断代码的限制)。

将该参数的类型更改为 settingKey: C TypeScript 将能够理解三个参数之间的关系:

type SettingActionCreator<T> = <
L extends T,
K extends keyof L,
C extends keyof L[K]
>(
type: K,
settingKey: C, // <-- changed from keyof L[K]
settingValue: L[K][C]
) => void;


declare const Type: {
readonly TypeA: unique symbol,
readonly TypeB: unique symbol,
readonly TypeC: unique symbol
}

export interface SomeSettings {
[Type.TypeA]: {
settingA1: "valueA1" | "valueA2";
settingA2: "valueA3" | "valueA4";
},
[Type.TypeB]: {
settingB1: "valueB1" | "valueB2",
settingB2: "valueB3" | "valueB4"
},
[Type.TypeC]: {
//
}
}

const setSomeSetting: SettingActionCreator<SomeSettings> = (
type,
settingKey,
settingValue
) => {}

这会导致您正在寻找的错误类型:

setSomeSetting(Type.TypeB, "settingB1", "valueA3")
// Argument of type '"valueA3"' is not assignable to parameter of type '"valueB1" | "valueB2"'.

关于typescript - 如何使用嵌套接口(interface)限定 TypeScript 泛型类型的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57681717/

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