typescript - 来自枚举的 Typescript 类型推断抛出“类型实例化过深并且可能无限”。
问题描述
我有一个场景,我想将枚举映射到一个类型,以便用户可以调用一个函数,并根据传递给第一个参数的枚举推断第二个参数的类型。
我已将其设置如下:
enum MyEnum {
One,
Two
}
interface OnePayload {
one: string;
}
interface TwoPayload {
two: string;
}
type FuncPayload<T> = T extends MyEnum.One
? OnePayload
: T extends MyEnum.Two
? TwoPayload
: any;
const func = <T extends MyEnum>(key: T, payload?: FuncPayload<T>) => {
return payload;
};
可以按如下方式使用:
func(MyEnum.One,{one: 'a'}); // OK
func(MyEnum.Two,{one: 'a'}); // Throws type error
func(MyEnum.Two,{two: 'a'}); // OK
这很好用,除了在我的示例中我有 100~ 枚举值我想映射到它们各自的类型。一旦我向类型添加了这么多条件,它就会在我使用该类型时FuncPayload
开始抛出Type instantiation is excessively deep and possibly infinite.
错误。
有没有更好的方法来实现这一点?或b)使用此方法解决此错误的方法?
解决方案
您是否考虑过使用Union Types和Type Guards,这样您就不需要实际传递枚举类型?
interface PayloadA {
one: string;
}
interface PayloadB {
two: string;
}
function isPayloadA(object: PayloadA | PayloadB): object is PayloadA {
return (object as PayloadA).one !== undefined;
}
function myOperation(payload: (PayloadA|PayloadB)) {
if (isPayloadA(payload)) {
// payload is now strongly typed as PayloadA
}
}
我想这最终取决于您要完成的工作。你的func
功能应该做什么?强投一个松散类型的对象?
推荐阅读
- android - 我想同时从前置摄像头录制屏幕和录制视频。可能吗?
- javascript - 如何为具有多个 y 轴的多折线图中的每一行分配特定的 id
- python - Python:读/写大量小文件
- sitefinity - Sitefnity 邮件列表导出生成错误的 URL
- php - Typo3 介绍包版本 9.5
- c - SPI从机将数据读入stm32上的缓冲区?
- scroll - 如何缩放蒙版 uiimage?
- javascript - 具有深层嵌套对象的代理处理程序
- r - 将结果集从 mysql 转换为导致延迟的数据帧
- google-cloud-dataflow - 收到错误“模板参数无效。” 从作曲家启动数据准备模板时