基于输入枚举的Typescript条件返回接口

基于输入枚举的Typescript条件返回接口,typescript,enums,conditional-types,Typescript,Enums,Conditional Types,需求是提供一个枚举数组作为参数来定义返回类型接口。基于这些枚举属性Key.A和/或Key.B返回类型界面应包含A1和/或B1以及属性键(如枚举键)A和/或B 预设置如下所示: 从“某处”导入{parse};\\将首先大写配置lvl属性 枚举键{ A=“A”, B=“B”, } 接口A1{ x:字符串; } 接口B1{ y:字符串; } FF类型={ A:A1; B:B1; }; 类型Conf=???; 常量Fn=(键:E[],配置:未知):配置=>{ 将parse.JSON(key,config

需求是提供一个枚举数组作为参数来定义返回类型接口。基于这些枚举属性
Key.A
和/或
Key.B
返回类型界面应包含
A1
和/或
B1
以及属性键(如枚举键)
A
和/或
B

预设置如下所示:

从“某处”导入{parse};\\将首先大写配置lvl属性
枚举键{
A=“A”,
B=“B”,
}
接口A1{
x:字符串;
}
接口B1{
y:字符串;
}
FF类型={
A:A1;
B:B1;
};
类型Conf=???;
常量Fn=(键:E[],配置:未知):配置=>{
将parse.JSON(key,config)作为Conf返回;
};
结果应该是使用一些枚举值调用
Fn
,返回的接口只包含相应的属性,如:

const config='{“b”:{“y”:“some string”}};
const res=Fn([Key.B],config);
console.log(res.B.y)/“某些字符串”
console.log(res.A.x)//类型错误:类型上不存在属性“A”
基于此,我尝试了以下方法:

type Conf={
[K in keyof typeof Key]:K扩展了E[keyof E]?FF[K]:从不;
};
常数res=Fn([Key.B]);
通过此实现,密钥的所有属性都存在于
res
中:

第二种方法是定义类Conf

type Conf={
[K in E]:K扩展E[keyof E]?FF:从不;
};
返回接口中只存在属性
b
,但我无法找到如何索引
FF
,以根据enum=>
B1
选择正确的接口。此外,生成的界面是
res.b.
而不是
res.b.


这确实很棘手,因为
键.B
键“B”和
键“B”都是不同的

如果您愿意重写映射
FF
,使其由实际的枚举值
“a”
“b”
而不是枚举属性名设置关键帧,那么它就变得非常简单。您只需使用
Pick
获取返回类型

type FF = {
  a: A1;
  b: B1;
};

const fn = <E extends Key>(key: E[], config?: unknown): Pick<FF, E> => {
  return parse.JSON(key, config) as Pick<FF, E>;
};

const res1: {b: B1} = fn([Key.B]);
const res2: {a: A1} = fn([Key.A]);
const res3: {a: A1, b: B1} = fn([Key.A, Key.B]);
类型FF={
a:A1;
b:B1;
};
常量fn=(键:E[],配置?:未知):Pick=>{
返回parse.JSON(key,config)作为Pick;
};
常量res1:{b:B1}=fn([Key.b]);
常量res2:{a:A1}=fn([Key.a]);
常量res3:{a:A1,b:B1}=fn([Key.a,Key.b]);

否则,我也不能完全理解它。

请在帖子中包含实际代码,而不是链接到代码图片;代码链接可能会随着时间的推移而中断,并且无法搜索图像形式的文本。如果没有其他解决方案,那么这将适用于我。实际枚举值的问题在于,这些值包含连字符格式的字符串,如
some key
。这将使
res
的处理有点像
res1['some-key'].y
res1.[key.B].y