使用TypeScript推断嵌套对象中的返回类型
这是关于类似主题的前一个问题,但它被简化了一点 本质上,我试图做的是通过转换函数传递对象的参数和值(它将是一个factory生成器,但我在这里简化了它,将数字转换为字符串,反之亦然),然后将这些属性分配给返回的对象并保留键入 这是我一直在试验的代码:使用TypeScript推断嵌套对象中的返回类型,typescript,Typescript,这是关于类似主题的前一个问题,但它被简化了一点 本质上,我试图做的是通过转换函数传递对象的参数和值(它将是一个factory生成器,但我在这里简化了它,将数字转换为字符串,反之亦然),然后将这些属性分配给返回的对象并保留键入 这是我一直在试验的代码: type Config<T extends {[key:string]: number | string}> = { inst?: T } function convert ( value: string ): number;
type Config<T extends {[key:string]: number | string}> = {
inst?: T
}
function convert ( value: string ): number;
function convert ( value: number ): string
function convert( value: any ): any {
if ( typeof value === 'number' ) {
return value.toString();
}
return parseInt( value.toString(), 10 );
}
function init<T extends {[key:string]: any}>(db, config: Config<T>): T & {} {
let ret: any = {};
if ( config.inst ) {
for (let [key, value] of Object.entries(config.inst)) {
let res = convert( value );
ret[ key ] = res;
}
}
return ret;
}
let a = convert( '1' ); // `a` is a `number`
let b = convert( 2 ); // `b` is a `string`
let { strToNum, numToStr } = init( null, { inst: { strToNum: '1', numToStr: 2 } } );
// `strToNum` is a string - should be a number
// `numToStr` is a number - should be a string
类型配置={
仪器:T
}
函数转换(值:字符串):数字;
函数转换(值:数字):字符串
函数转换(值:任意):任意{
如果(值的类型=='number'){
返回值.toString();
}
返回parseInt(value.toString(),10);
}
函数init(db,config:config):T&{}{
设ret:any={};
如果(config.inst){
for(让Object.entries的[key,value](config.inst)){
设res=转换(值);
ret[key]=res;
}
}
返回ret;
}
设a=转换('1');//`是一个数字`
设b=转换(2);//`b`是一个字符串`
设{strToNum,numToStr}=init(null,{inst:{strToNum:'1',numToStr:2}});
//'strToNum'是一个字符串-应该是一个数字
//`numtost`是一个数字-应该是一个字符串
convert函数似乎可以处理重载类型,但我一辈子都搞不清楚如何将该类型应用于返回对象的参数。有什么想法吗?您基本上想结合(表示将
字符串
切换为数字
,反之亦然)和(表示每个属性上的此切换):
看起来不错
另外,您还可以使用该条件类型来表示
convert()
函数,出于某些目的,这可能比多个重载更可取:
function convert<T extends string | number>(value: T): Convert<T>;
function convert(value: string | number): string | number {
if (typeof value === 'number') {
return value.toString();
}
return parseInt(value.toString(), 10);
}
convert(Math.random()<0.5 ? "1" : 2); // string | number
// the above will fail with overloads
函数转换(值:T):转换;
函数转换(值:字符串|编号):字符串|编号{
如果(值的类型=='number'){
返回值.toString();
}
返回parseInt(value.toString(),10);
}
转换(Math.random()您基本上想要组合(表示将字符串转换为数字,反之亦然)和(表示每个属性上的此转换):
看起来不错
另外,您还可以使用该条件类型来表示convert()
函数,出于某些目的,这可能比多个重载更可取:
function convert<T extends string | number>(value: T): Convert<T>;
function convert(value: string | number): string | number {
if (typeof value === 'number') {
return value.toString();
}
return parseInt(value.toString(), 10);
}
convert(Math.random()<0.5 ? "1" : 2); // string | number
// the above will fail with overloads
函数转换(值:T):转换;
函数转换(值:字符串|编号):字符串|编号{
如果(值的类型=='number'){
返回值.toString();
}
返回parseInt(value.toString(),10);
}
转换(Math.random()太棒了-谢谢你!我基于此,尝试从string
和number
类型切换到类。如果你愿意看一看,那就太棒了-谢谢你!太棒了-谢谢你!我基于此,尝试从string
和number
类型切换如果你愿意看一看,那就太棒了——谢谢!
function convert<T extends string | number>(value: T): Convert<T>;
function convert(value: string | number): string | number {
if (typeof value === 'number') {
return value.toString();
}
return parseInt(value.toString(), 10);
}
convert(Math.random()<0.5 ? "1" : 2); // string | number
// the above will fail with overloads