Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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_Typescript Typings_Typescript Generics - Fatal编程技术网

Typescript:如何根据参数类型获取函数的返回类型?

Typescript:如何根据参数类型获取函数的返回类型?,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,我希望返回类型基于“config”参数 现在exampleFn函数的返回类型为空{} 接口{ a:数字; b:弦; } 常量默认值={ 答:(num:number)=>1+num, b:(str:string)=>a'+str, } const exampleFn=(配置:T)=>{ 常量映射={}; Object.entries(config.forEach)([key,val])=>{ map[key]=默认_值[key]; }); 返回图; }; 常量example1=exampleFn(

我希望返回类型基于“config”参数

现在exampleFn函数的返回类型为空{}

接口{
a:数字;
b:弦;
}
常量默认值={
答:(num:number)=>1+num,
b:(str:string)=>a'+str,
}
const exampleFn=(配置:T)=>{
常量映射={};
Object.entries(config.forEach)([key,val])=>{
map[key]=默认_值[key];
});
返回图;
};
常量example1=exampleFn({a:123});//我希望example1返回类型为“{a:(num:number)=>number}”
const example2=exampleFn({b:'asd'});//我希望example2返回类型为“{b:(str:string)=>string}”
const example3=exampleFn({a:123,b:'asd'});//我希望示例3的返回类型为“{a:(num:number)=>number,b:(str:string)}=>string”

有可能吗?

编译器本身不太聪明,无法解决这个问题,但是您当然可以描述您想要的类型,并在
exampleFn()的实现中使用它,以防止它抱怨。。。请记住,这样的类型断言将类型安全的负担从编译器转移到了您身上

这是我想你想要的类型:

{ [K in Extract<keyof T, keyof Interface>]: typeof DEFAULT_VALUES[K] }
您可以看到,我断言
key
是接口的
key
(因为编译器只知道
key
string
),并且
map
是所需的返回类型。让我们看看它是如何工作的:

const example1 = exampleFn({ a: 123 });
console.log(example1.a(123)); // 124
console.log(example1.b); // undefined
// error!  --------> ~
// Property 'b' does not exist on type '{ a: (num: number) => number; }'
const example2 = exampleFn({ b: 'asd' });
console.log(example2.b("asd")); // aasd
const example3 = exampleFn({ a: 123, b: 'asd' });
console.log(example3.b("asd")); // aasd
console.log(example3.a(123)); // 124
我觉得不错


回答得很好,非常感谢
const example1 = exampleFn({ a: 123 });
console.log(example1.a(123)); // 124
console.log(example1.b); // undefined
// error!  --------> ~
// Property 'b' does not exist on type '{ a: (num: number) => number; }'
const example2 = exampleFn({ b: 'asd' });
console.log(example2.b("asd")); // aasd
const example3 = exampleFn({ a: 123, b: 'asd' });
console.log(example3.b("asd")); // aasd
console.log(example3.a(123)); // 124