【问题标题】:Typescript required key A or key B打字稿需要密钥 A 或密钥 B
【发布时间】:2021-11-10 13:58:34
【问题描述】:

我是打字稿的新手

我有一个接口 ABC,我希望 propA 或 propB 在其中。它还有其他属性

interface ABC {
  propA: string 
  propB: string 
  propC: string
  propD?: string 
}

我该怎么做?

我是根据https://stackoverflow.com/a/40510700/10433835这个答案做的

interface ABC { 
   propC: string
   propD?: string 
}

interface A extends ABC {
  propA: string
}

interface B extends ABC {
    propB: string
}  

export type final = A | B

但是当我做这样的事情时

 function somethingCalled (a:A) {
 }

 const b:final = req.body 

 somethingCalled(b)

它抛出以下错误 'final' 类型的参数不可分配给 'interface A' 类型的参数。

【问题讨论】:

  • 编译器是正确的。您告诉它“propApropB 存在于我的变量中”,然后您尝试调用一个函数,该函数要求该变量上存在 propA。如果有propB 呢?该功能将无法正常工作。
  • Silvio,你能告诉我如何解决它吗?
  • 还要注意 interface A extends ABCinterface B extends ABC... 这完全没用,因为 ABC 已经有了 propAprobB。你的意思是不延长它吗?
  • @Samathingamajig 更新了问题

标签: typescript


【解决方案1】:

我认为您想要的是使用discriminating union,其中联合的单个对象由区分它们的属性来区分。在您的情况下,propA 告诉它是ApropB 告诉它是B。以下是我们如何使用它们:

interface ABC {
  propC: string
  propD?: string 
}

interface A extends ABC {
  propA: string
  anotherA: number;
}

interface B extends ABC {
    propB: string
    somethingB: boolean;
}  

export type FinalType = A | B

 function somethingCalled (a:FinalType) {
     if('propA' in a){
         a.anotherA
         a.somethingB; // Error: Property 'somethingB' does not exist on type 'A'
     } else {
         a.somethingB
         a.anotherA // Error: Property 'anotherA' does not exist on type 'B'.
     }
 }

const req: any = '';

 const b:FinalType  =( req as any).body 

 somethingCalled(b)

一旦明确区分,您可以看到 Typescript 如何判断其他属性不属于该类型。

TS Playground 链接:https://tsplay.dev/mpvDpw

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2018-01-13
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多