Typescript 有没有一种简单的方法可以扩展这些接口的联合类型中的所有单独接口?

Typescript 有没有一种简单的方法可以扩展这些接口的联合类型中的所有单独接口?,typescript,Typescript,我有三个不同的接口 interface SmallOrder { prop1: string } interface MediumOrder { prop2: string } interface LargeOrder { prop3: string } type Order = SmallOrder | MediumOrder | LargeOrder; type Res = Order[] type Country = 'US' | 'International' 例

我有三个不同的接口

interface SmallOrder {
  prop1: string
}

interface MediumOrder {
  prop2: string
}

interface LargeOrder {
  prop3: string
}

type Order = SmallOrder | MediumOrder | LargeOrder;

type Res = Order[]

type Country = 'US' | 'International'
例如,响应就是我从API请求中得到的。但是,在得到响应之后,我需要进行另一个API调用,以获取第一个响应中未出现的订单的属性,假设该属性的类型为
Country
。当我提出这个请求时,我会将这个属性添加到我以前保存的每个订单中。问题是,我怎样才能轻松地键入这些新订单

我想要下面这样的东西(显然不起作用,因为Order不是一个接口),但我想要一个

interface OrderWithCountry extends Order {
  country: Country
}

so that it would become something like
type OrderWithCountry = SmallOrderWithCountry | MediumOrderWithCountry | LargeOrderWithCountry
显然,我可以定义接口
SmallOrderWithCountry
等,然后定义
OrderWithCountry
,但是如果我有50种订单类型呢有更简单的方法吗?

编辑: 我想我已经找到了下面第一个答案的解决方案,但对于下面的示例,问题仍然存在。特别是,为什么我不能编写if语句检查
o.common
?我可能需要一个护卫,但为什么我不能检查一下酒店呢

interface SmallOrder {
  common: string,
  prop1: string
}

interface MediumOrder {
  common: string,
  prop2: string
}

interface LargeOrder {
  common: string,
  prop3: string
}

interface XLargeOrder {
  prop4: number
}

type Order = SmallOrder | MediumOrder | LargeOrder | XLargeOrder;

type Res = Order[]

type Country = 'US' | 'International'

type OrderExt = Order & { country: Country }

const myOrders: Order[] = [
  { common: 'one', prop1: "small" },
  { common: 'two', prop2: "medium" },
  { common: 'three', prop3: "large" },
  { common: 'four', prop1: "smaller" }
]

const myExtOrders: OrderExt[] = myOrders.map(o => ({
  ...o,
  country: 'US'
}))

myExtOrders.map(o => {
  if (o.common) {
    o.common.trim()
  }
})

如果我正确理解了您想要的内容,那么()应该可以工作

type OrderWithCountry = Order & {
  country: Country
}
在键入上下文中,
&
是类型交集运算符,将其操作数中的所有属性合并为一个新类型

关于
common
属性的第二个问题,TS不允许您在没有类型保护的情况下使用它,因为它并不存在于所有类型上。编写和使用类型保护的一种方法如下(您可以修改名称和特定类型约束以适应实际场景):


嗨,我以为你的答案是最后的,但实际上我的问题仍然存在。我对TS错误的确切情况进行了编辑。@evianspring我更新了答案以解决您的新问题
function isOrderWithCommonProp(o: OrderExt & { common?: string }): o is OrderExt & { common: string } {
  return !!o.common
}

myExtOrders.map(o => {
  if (isOrderWithCommonProp(o)) {
    o.common.trim()
  }
})