【发布时间】:2021-09-23 07:36:50
【问题描述】:
在我的项目中,我有两个枚举 SourceEnum 和 TargetEnum。对于这两个枚举,都存在一个函数,该函数使用一些取决于枚举值的参数调用。预期参数的确切类型由SourceParams 和TargetParams 两种类型映射定义。
enum SourceEnum {
SOURCE_A = 'SOURCE_A',
SOURCE_B = 'SOURCE_B'
}
enum TargetEnum {
TARGET_A = 'TARGET_A',
TARGET_B = 'TARGET_B',
}
interface SourceParams {
[SourceEnum.SOURCE_A]: { paramA: string };
[SourceEnum.SOURCE_B]: { paramB: number };
}
interface TargetParams {
[TargetEnum.TARGET_A]: { paramA: string };
[TargetEnum.TARGET_B]: { paramB: number };
}
function sourceFn<S extends SourceEnum>(source: S, params: SourceParams[S]) { /* ... */ }
function targetFn<T extends TargetEnum>(target: T, params: TargetParams[T]) { /* ... */ }
我有一个映射,其中包含一个函数来评估每个源值的目标值,我想要做的是,确保用于调用 sourceFn(x, params) 的 params 对象也适用于调用 targetFn(mapping[x](), params) .为了实现这一点,我创建了这种类型:
type ConstrainedMapping = {
[K in SourceEnum]: <T extends TargetEnum>() => (SourceParams[K] extends TargetParams[T] ? T : never)
};
const mapping: ConstrainedMapping = {
[SourceEnum.SOURCE_A]: () => TargetEnum.TARGET_A;
// ...
}
但是像上面那样定义mapping会给我以下错误:
Type 'TargetEnum.TARGET_A' is not assignable to type '{ paramA: string; } extends TargetParams[T] ? T : never'.
我的打字看起来很清楚,所以我真的不明白这里有什么问题。我想打字稿在某些时候无法缩小确切的枚举值。
有没有办法做到这一点?我目前正在使用 Typescript 4.2,但我也在 4.3 和 4.4-beta 上进行了尝试,并且都表现出相同的行为。非常感谢 4.2 中的解决方案,但我也可以在未来版本中提供解决方案。
【问题讨论】:
-
请提供更多致电
targetFn(mapping[x](), params)和sourceFn(x, params)的示例。你从哪里得到x? -
x在这里只是一个SourceEnum类型的任意值。这两个功能实际上并不太相关。我只是想以一种实际的方式表明SourceParams[typeof x]应该可以分配给TargetParams[typeof mapping[x]()]用于任何x: SourceEnum。
标签: typescript types typescript-types