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];