首页 > 解决方案 > 两个属性名称之一

问题描述

type B = {
 c: string
}
    
type T = {
  a: string
  b: B
}

我想让 T2 看起来像

type T2 = {
  a: string
  ['b' or 'prefixB']: B
}

基本上我希望 T 具有 a 和 b 或 prefixB 属性 - 你知道如何以简单的方式做到这一点吗?像两个之一

标签: typescripttypescript-typings

解决方案


type Aa = {a: string}
type T2 =  Aa & ({prefixB: string} | {b: string})

const foo: T2 = {
  a: "a",
  b: "b"
}
foo.a // a
foo.b // b
foo.prefixB // Property 'prefixB' does not exist

const foo2: T2 = {
  a: "a",
  prefixB: "prefixB"
}
foo2.a // string
foo2.prefixB // prefixB
foo2.b // Property 'b' does not exist

我认为这是工作


更新

type Aa = {a: string}
type B = {
  c: string
}

type T2 =  Aa & ({prefixB: B} | {b: B})

const foo: T2 = {
  a: "a",
  b: {
    c: "obj"
  },
}
foo.a // a
foo.b // { c: "obj" }
foo.prefixB // Property 'prefixB' does not exist

const foo2: T2 = {
  a: "a",
  prefixB: {
    c: "obj"
  }
}
foo2.a // a
foo2.prefixB // { c: "obj" }
foo2.b // Property 'b' does not exist

const foo3: T2 = {
  a: "a",
  prefixB: {
    c: "obj"
  },
  b: {
    c: "obj"
  }
}
foo3.a // a
foo3.prefixB //  Property 'prefixB' does not exist
foo3.b // Property 'b' does not exist

推荐阅读