Typescript TS映射类型:根据值有条件地删除某些键

Typescript TS映射类型:根据值有条件地删除某些键,typescript,Typescript,我正在寻找一种解决方案来生成一个映射类型,该类型根据映射键的值省略某些键 具体例子: 我有一个option:Optionsstruct,其中Options是形状的联合类型: { type: DataType } or { type: DataType, params: DataParam } 联合体的某些元素具有params键,而有些元素没有。我想利用映射类型生成这样的并集。目前我有这个工作解决方案(): 类型数据参数={ 贸易:从不; 商业酒吧:{ 间隔:数字; 国际货币单位:“ms”|“s

我正在寻找一种解决方案来生成一个映射类型,该类型根据映射键的值省略某些键

具体例子:

我有一个
option:Options
struct,其中
Options
是形状的联合类型:

{ type: DataType } or { type: DataType, params: DataParam }
联合体的某些元素具有
params
键,而有些元素没有。我想利用映射类型生成这样的并集。目前我有这个工作解决方案():

类型数据参数={
贸易:从不;
商业酒吧:{
间隔:数字;
国际货币单位:“ms”|“s”|“m”|“ticks”|“vol”;
};
};
类型数据类型=数据参数的键;
类型选项ForDataType={
类型:T;
}&(数据参数[T]从不扩展
? {}
: {
参数:数据参数[T];
})
类型选项={
[数据类型中的数据类型]:数据类型选项;
}[数据类型];
但我并不完全满意这个丑陋的交叉点+延伸的把戏。有没有更好的方式来表达这种意图


我有一种(可能是错误的)印象,即当
{key:never}
时,该键实际上被排除在结构之外,因为没有任何内容是
never
的子类型,因此无法为该键分配任何内容。事实并非如此,这对我来说很奇怪。

我有点尴尬,因为我没有进行谷歌尽职调查™️ 彻底地。搜索关键词,然后我就去了,在那里,有同样疑问的人发布问题并找到解决方案

因此,这个问题的摘要是,我的怀疑是正确的,TS团队也认为
{key:never}
应该排除密钥,但是由于一些技术困难,他们无法实现它

解决方法是创建一个过滤所需键的实用程序类型,并将其作为中间步骤应用。解决方案取自该问题并根据我的用例进行了调整,如下所示:

// Utilities:
type FilteredKeys<T> = { [P in keyof T]: T[P] extends never ? never : P }[keyof T];
type ExcludeNeverFields<O> = {
  [K in FilteredKeys<O>]: O[K]
}

// Use case:
type DataParams = {
  trade: never;
  trade_bar: {
    interval: number;
    intervalUnit: "ms" | "s" | "m" | "ticks" | "vol";
  };
};

type DataTypes = keyof DataParams;

type Options = {
  [DataType in DataTypes]: ExcludeNeverFields<{
    type: DataType;
    params: DataParams[DataType];
  }>
}[DataTypes];
//实用程序:
类型FilteredKeys={[P in keyof T]:T[P]从不扩展?从不:P}[keyof T];
类型ExcludeNeverFields={
[K in FilteredKeys]:O[K]
}
//用例:
类型数据参数={
贸易:从不;
商业酒吧:{
间隔:数字;
国际货币单位:“ms”|“s”|“m”|“ticks”|“vol”;
};
};
类型数据类型=数据参数的键;
类型选项={
[数据类型中的数据类型]:ExcludeNeverFields
}[数据类型];

不确定是否更好(而不是
从不
检查key
数据参数是否映射并简化
选项
)@AlekseyL。谢谢你的回复。但是我仍然想保持原样,因为在我的用例中,我想把东西放在一个地方。我已经修改了我的问题以消除歧义。
// Utilities:
type FilteredKeys<T> = { [P in keyof T]: T[P] extends never ? never : P }[keyof T];
type ExcludeNeverFields<O> = {
  [K in FilteredKeys<O>]: O[K]
}

// Use case:
type DataParams = {
  trade: never;
  trade_bar: {
    interval: number;
    intervalUnit: "ms" | "s" | "m" | "ticks" | "vol";
  };
};

type DataTypes = keyof DataParams;

type Options = {
  [DataType in DataTypes]: ExcludeNeverFields<{
    type: DataType;
    params: DataParams[DataType];
  }>
}[DataTypes];