是否有可能(还)返回一个输入对象,其类型映射到每个属性?

塞夫·里德

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

{
  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]]
};

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

塞夫·里德

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]]
};

我的猜测并不太远。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将流中的每个项目映射到一个Promise并返回其值

是否有将对象参数映射到 TypeScript 中另一个对象的简写?

如何将一个对象映射到所有输入元素?

是否有可能将“撤消”映射到另一个组合?

是否有可能在春季-MVC嵌套映射映射到一个全球性的路径?

是否有内置的Python函数,当将函数映射到可迭代对象时,该函数将返回第一个True-ish值?

是否可以创建一个类,其每个实例将具有不同的类型?

将具有多个属性的对象映射到另一个对象,然后收集到列表

从 List 对象创建一个 SortedMap,其 Value 表示为映射到特定 Key 的 N 个最低对象属性的列表

尝试返回一个对象并显示其属性

键入将对象中的属性映射到另一个属性的函数

以延迟的方式将一个对象的输出映射到另一个对象的输入

是否有一个表示具有任何属性但没有数组的对象的类型

如何使用流 lambda 将包含其 Collection 成员的对象列表映射到另一个具有 Set 作为成员的对象?

将多个相同名称的表单输入映射到一个JavaScript对象中

Typescript接口类型映射到一个对象,该对象包含一个原始对象和一个从原始对象的字段构建的新对象

Java-将一个列表中的对象属性映射到另一个对象列表

表示将一个对象映射到相同属性的另一个对象

改进代码:是否有更好的方法将Java中的一个(较短)数组映射到另一个(较长)对象数组?

Haskell中是否有一个函数返回其参数的类型(或显示该类型的字符串)?

将一个对象数组中的属性值映射到另一对象数组中的属性

在RealmSwift中,当两个对象中的每个对象都具有另一个对象的属性时,是否会创建一个保留周期?

MapStruct:如何将所有属性映射到列表的第一个元素?

是否有可能构建一个迭代器来生成对其在next()中修改的对象的引用?

如何向TS指示参数上的每个属性都应映射到返回类型上的属性?

如何使用一个对象的多个属性并将其映射到另一个对象中的一个?

javascript 将一个新数组映射到一个添加新属性的现有数组上

使用输入属性 (id, name) 为文本类型的每个输入创建一个标签

RxDart,将列表的每个项目映射到来自永无止境的流的另一个对象