typescript - 是否有可能(还)返回一个输入对象,其类型映射每个属性?
问题描述
简而言之,我想要一个采用非预定义类型的函数,如下所示:
{
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]]
};
我的猜测并没有太远。
推荐阅读
- game-development - 应用发明者:只要按下按钮,如何移动精灵?
- azure-devops - Azure DevOps 中 TFVC 的最大存储大小是多少?
- c++ - 如何从 C++ 服务访问 Google 联系人?
- java - 加载错误的 PDF 时捕获 PDFBox 警告
- c - 如何在 Eclipse 中运行/打开 ac 文件
- iis - 在 IIS 中设置 ASP.Net Core 2.1V
- java - java中int类型的高位是哪一位?
- jquery - 未捕获的 ReferenceError:未定义 GetListItems
- snmp - 为未知警报创建 mib(陷阱类型 1.3.6.1.4.1.17304.7.3.6.1)
- python - Sagemaker S3 文件夹未完全迭代