使用TypeScript推断嵌套对象中的返回类型

使用TypeScript推断嵌套对象中的返回类型,typescript,Typescript,这是关于类似主题的前一个问题,但它被简化了一点 本质上,我试图做的是通过转换函数传递对象的参数和值(它将是一个factory生成器,但我在这里简化了它,将数字转换为字符串,反之亦然),然后将这些属性分配给返回的对象并保留键入 这是我一直在试验的代码: type Config<T extends {[key:string]: number | string}> = { inst?: T } function convert ( value: string ): number;

这是关于类似主题的前一个问题,但它被简化了一点

本质上,我试图做的是通过转换函数传递对象的参数和值(它将是一个factory生成器,但我在这里简化了它,将数字转换为字符串,反之亦然),然后将这些属性分配给返回的对象并保留键入

这是我一直在试验的代码:

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