Typescript:如何根据参数类型获取函数的返回类型?
我希望返回类型基于“config”参数 现在exampleFn函数的返回类型为空{}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(
接口{
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