在Typescript中,如何根据参数确定函数的返回类型?

jslywgbw  于 2023-03-04  发布在  TypeScript
关注(0)|答案(1)|浏览(249)

在Typescript中,我希望根据函数的参数确定其返回类型。在下面的示例中,如果使用ComponentKey.A类型的参数调用getPropsForComponentKey,则其返回类型应为AProps。我应该能够使用控制流分析来防止返回具有不兼容类型的值。然而,我不确定如何描述这个函数的类型,以便在传入'A'时返回AProps
我尝试使用泛型类型T,并使用它索引到索引访问类型PropTypesForComponentKey,以便返回类型将解析为APropsBProps,这取决于传入函数的内容。编译器错误指示AProps不可赋值给PropTypesForComponentKey[T]
TSPlayground

type AProps = {
  value: number;
}

type BProps = {
  description: string;
}

enum ComponentKey {
  A = 'A',
  B = 'B',
}

type PropTypesForComponentKey  = {
  [ComponentKey.A]: AProps;
  [ComponentKey.B]: BProps;
}

// this object enforces the mapping between key and value types
const propsForComponentKey: PropTypesForComponentKey = {
  [ComponentKey.A]: { value: 3 },
  [ComponentKey.B]: { description: 'foo' },
}

// we know that aProp is of type AProps when we use 'A' as an index into propsForComponentKey
const aProp = propsForComponentKey['A'];

// How do I enforce the return type of this function?
function getPropsForComponentKey<T extends ComponentKey>(componentKey: T): null | PropTypesForComponentKey[T] {
  switch(componentKey) {
    case ComponentKey.A:
      return { value:  3 } as AProps;
    case ComponentKey.B:
      return { description: 'foo' };
  }
  return null;
}
xqk2d5yq

xqk2d5yq1#

我没有设法用控制流分析来得到这个行为。尽管,你用函数重载得到了同样的结果。这有点冗长,但是完成了任务。

function getPropsForComponentKey(componentKey: ComponentKey.A): AProps
function getPropsForComponentKey(componentKey: ComponentKey.B): BProps
function getPropsForComponentKey(componentKey: string): null
function getPropsForComponentKey(componentKey: ComponentKey | string): null | AProps | BProps {
  switch(componentKey) {
    case ComponentKey.A:
      return { value:  3 } as AProps
      
    case ComponentKey.B:
      return { description: 'foo' } as BProps;
  }
  return null;
}

Playground

相关问题