Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 未从结果中排除条件类型_Typescript - Fatal编程技术网

Typescript 未从结果中排除条件类型

Typescript 未从结果中排除条件类型,typescript,Typescript,我创建了一个示例来说明问题,下面是代码: 导出枚举转换动作{ Delete='Delete', } 类型FilteredKeys={[P in keyof T]:T[P]扩展keyof TransformerActions?never:T[P]扩展U?P:never}[keyof T]; 类型Fn=(…args:any[])=>any; 导出类型转换={ [P in FilteredKeys]:S[P]扩展Fn?返回类型:从不; }; 导出常量对象映射器=( 资料来源:S, 地图:M ):转换=

我创建了一个示例来说明问题,下面是代码:

导出枚举转换动作{
Delete='Delete',
}
类型FilteredKeys={[P in keyof T]:T[P]扩展keyof TransformerActions?never:T[P]扩展U?P:never}[keyof T];
类型Fn=(…args:any[])=>any;
导出类型转换={
[P in FilteredKeys]:S[P]扩展Fn?返回类型:从不;
};
导出常量对象映射器=(
资料来源:S,
地图:M
):转换=>{
const result:TransformerMap={};
for(对象键的常数k(源)){
如果(!map[k]){
继续;
}
常量值=源[k];
if(映射?[k]==变换动作.删除){
继续;
}
if(映射类型?[k]=“函数”){
结果[k]=变换(映射[k](源));;
继续;
}
结果[k]=数值;
}
返回结果;
}
常量源={
名字:“保罗”,
姓:“考恩”,
年龄:50,,
地址:“不知道在哪里的某个地方”
};
类型源=类型源
常数映射={
地址:TransformerActions.Delete,
姓名:(n:Source)=>`${n.firstName}${n.lasname}`
}
const result=objectMapper(源,映射)
/*应该是
{
名称:string
}
我认为对枚举进行过滤是不可能的,但不确定返回类型为什么不起作用
*/
基本上,我有一个
objectTransformer
函数,我想使用条件类型过滤掉返回特定枚举的所有字段,或者如果字段是函数,那么我想让该字段返回函数的
ReturnType
,而不是函数本身

常量映射={
地址:TransformerActions.Delete,
姓名:(n:Source)=>`${n.firstName}${n.lasname}`
}

这两个条件现在都不适用于我:)。

我希望这就是你的意思,我仍然不清楚你为什么需要
TransformerActions。如果只是从map对象中省略一个键得到相同的结果,请删除
。。。但我想你可能有一个特定的用例,你试图在这里给出一个例子。我希望这也是你的意思-

导出枚举转换动作{
Delete='Delete',
}
/**采用类似{foo:number,bar:never}的类型返回类型{foo:number}*/
类型Removener=拾取;
类型Fn=(arg:T)=>any;
类型ObjectMap=Record
类型转换_Stage1={
[P在keyof M中]:M[P]扩展Fn?
返回类型:
M[P]扩展了TransformerActions。是否删除?
从未:
从未;
}
/**拆分转换只是为了清晰起见,您可能可以将其写入一种类型的Declaration*/
导出类型转换=移除;
导出常量对象映射器=(
资料来源:S,
地图:M
):转换=>{
将{}作为转换返回
}
常量源={
名字:“保罗”,
姓:“考恩”,
年龄:50,,
地址:“不知道在哪里的某个地方”
};
类型源=类型源
常数映射={
地址:TransformerActions.Delete,
姓名:(n:Source)=>`${n.firstName}${n.lasname}`
}
const result=objectMapper(源,映射);
/*只有result.name自动完成*/
result.name

我没有完全理解您要做的事情-在
映射中
因为您要传递给您的objectMapper-那么
名字
姓氏
呢?它们是否应该存在于
结果
对象中?如果否-那么
TransformerActions.Delete的目的是什么?把钥匙省略就行了。解释这一点将有助于给出有效的解决方案。。。从更一般的意义上讲,其中一个问题是
FilteredKeys
类型,当需要U[P]时,确实需要以T[P]为条件。因此,首先需要更好地理解/解释贴图键与源对象之间的关系keys@AviadHadad我已经添加了一个函数功能的简要概述。如果我能进一步澄清,请告诉我。