【问题标题】:How to handle two generic objects in Type Script function如何在 Typescript 函数中处理两个通用对象
【发布时间】:2022-01-15 21:15:12
【问题描述】:

我有两种泛型:

type Organization {
 id: String
 name: String
 type: String
}

type OrganizaationInput {
 id: String
 name: String
}

如您所见,区别仅在于一个参数(类型)。这两种类型都是由 codegen 生成的,我无法更改它们。 我还有一个函数可以将这种对象作为输入参数。

getCustomerFromOrganization(organization: Organization): Customers{
    ....
}

当我尝试使用 OrganizationInput 类型调用此函数时,出现了我的问题。 如何使用这两种类型调用函数 getCustomerFromOrganization?

p.s(组织:组织 | 组织输入)没有帮助

【问题讨论】:

  • 只需编写另一个参数类型为OrganizaationInput的函数
  • 我不喜欢复制粘贴。这是一个功能...
  • 此问题或其答案中没有generics;您可以取消标记并删除“通用”一词吗?另外,请考虑提供minimal reproducible example,它清楚地表明了您遇到的问题。你说“当我尝试调用这个函数时”......你能告诉我们吗?你又说“Organization | OrganizationInput 没有帮助”……你能再给我们看看吗?
  • 您的代码生成工具使用的是String 而不是stringThat's not recommended。由于您无法更改它,我想不幸的是您无能为力(或拼写错误的Organizaation),但也许您可以找到可以对此做些什么并告诉他们的人。祝你好运!

标签: typescript typescript-generics


【解决方案1】:

你可以使用overloading:

type Organization = {
    id: String
    name: String
    type: String
}

type OrganizaationInput = {
    id: String
    name: String
}

function getCustomerFromOrganization(organization: OrganizaationInput): void
function getCustomerFromOrganization(organization : Organization | OrganizaationInput): void{
   if ("type" in organization) {
        const { type } = organization;
    }
}

Link to playground

在函数内部,您需要检查实际类型。简单的选择是使用示例中的代码。

不过我建议type guard


type Organization = {
    id: String
    name: String
    type: String
}


function isOrganization(input: Organization | OrganizaationInput): input is Organization {
    return "type" in input;
} 

【讨论】:

【解决方案2】:

找到答案 -

if ("type" in organization) {
    const { type } = organization;
    }

【讨论】:

  • 我不清楚这是如何回答这个问题的,因为它不会编译。您能否提供足够的代码,以便可以将其放入 IDE 中并且有人可以亲眼看到它的工作原理?和/或提供指向 TS Playground 或其他显示它的 Web IDE 的链接?
  • 代码也应该直接编辑到答案的明文中(而不仅仅是作为 cmets 中的链接),因为它取决于 organizationOrganization | OrganizaationInput 类型,这不是提及。另外:你想让this 发生吗?如果没有,为什么会有重载签名?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2017-06-14
  • 2021-06-15
  • 2021-01-10
  • 2022-09-29
  • 1970-01-01
相关资源
最近更新 更多