首页 > 解决方案 > 是否有可能(还)返回一个输入对象,其类型映射每个属性?

问题描述

简而言之,我想要一个采用非预定义类型的函数,如下所示:

{
  name: string,
  list: Array,
  metadata: Object,
}

并返回这个

{
  name: MyStringProxy,
  list: MyArrayProxy,
  metadata: MyObjectProxy,
}

我知道如何在每个属性都具有相同类型的情况下返回一个对象(对象与打字稿中的另一个对象具有相同的键?)...

abstract function allPropsAre42<TYPE_IN>(obj: TYPE_IN): { [key in keyof TYPE_IN]: 42 };

...这是一个很好的起点,但它只将所有内容映射到一种类型。我想将每种类型映射到另一种类型。


我很确定这是不可能的,但这里有一些虚构的伪代码,就像我正在寻找的那样:

interface IPropMap {
  string: MyStringProxy,
  Array: MyListProxy,
  Object: MyObjectProxy,
}
// not real code
abstract function mapAllProps<TYPE_IN>(obj: TYPE_IN): { 
 [key in keyof TYPE_IN]: IPropMap[TYPE_IN[key]]
};

有可能在打字稿中做这样的事情吗?

标签: typescripttypescript-typings

解决方案


https://www.typescriptlang.org/docs/handbook/advanced-types.html#conditional-types

弄清楚了。使用条件类型映射,可以做到这一点:

type TypeName<T> =
    T extends string ? MyStringProxy :
    T extends Array ? MyArrayProxy :
    T extends object ? MyObjectProxy :
    undefined;


abstract function mapAllProps<TYPE_IN>(obj: TYPE_IN): { 
 [key in keyof TYPE_IN]: TypeName[TYPE_IN[key]]
};

我的猜测并没有太远。


推荐阅读