首页 > 解决方案 > 来自枚举的 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)使用此方法解决此错误的方法?

标签: typescript

解决方案


您是否考虑过使用Union TypesType 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功能应该做什么?强投一个松散类型的对象?


推荐阅读