首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据参数从映射类型返回类型

根据参数从映射类型返回类型
EN

Stack Overflow用户
提问于 2022-07-13 16:51:03
回答 1查看 42关注 0票数 2

我试图根据参数从泛型函数返回映射类型的值,在调用时似乎正确地检测到了该类型,但返回时出现了报告错误。

我没有考虑在genericFunction上使用重载,因为E在我的用例中可能有超过100个值。

代码语言:javascript
运行
复制
enum E {
  e1="e1",
  e2="e2"
}

interface E1Payload {
  payloadFrom1: string
  anotherField: number
}

interface E2Payload {
  payloadFrom2: string
}

type Mapping = {
  [E.e1]: E1Payload
  [E.e2]: E2Payload
}

function genericFunction<K extends keyof Mapping>(e: K): Mapping[K] {
  if (e === E.e1) {
    // ERROR: Type '{ payloadFrom1: string; anotherField: number; }' is not assignable to type 'Mapping[K]'.
    // Type '{ payloadFrom1: string; anotherField: number; }' is not assignable to type 'E1Payload & E2Payload'.
    // Property 'payloadFrom2' is missing in type '{ payloadFrom1: string; anotherField: number; }' but required in type 'E2Payload'.
    return {
      payloadFrom1: "e1",
      anotherField: 2
    }
  }
  // ERROR: Type '{ payloadFrom2: string; }' is not assignable to type 'Mapping[K]'.
  // Type '{ payloadFrom2: string; }' is not assignable to type 'E1Payload & E2Payload'.
  // Type '{ payloadFrom2: string; }' is missing the following properties from type 'E1Payload': payloadFrom1, anotherField
  return {
    payloadFrom2: "e2"
  }
}

// This work correctly
const payloadE1: E1Payload = genericFunction(E.e1)
const payloadE2: E2Payload = genericFunction(E.e2)

游乐场

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-13 17:12:07

您可以通过重写genericFunction以包含类似于映射的结构来解决这个问题:

代码语言:javascript
运行
复制
function genericFunction<K extends keyof Mapping>(e: K): Mapping[K] {
  return {
    [E.e1]: {
      payloadFrom1: "e1",
      anotherField: 2
    },
    [E.e2]: {
      payloadFrom2: "e2"
    }
  }[e]
}

对于更复杂的场景,我建议使用类型断言。TypeScript不能真正缩小泛型类型。这就是为什么它无法理解您在这里所做的if/else缩小的原因。

游乐场

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72969897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档