Typescript - 基础接口(interface)和扩展接口(interface)的联合类型

我有以下代码

interface BaseA {
  a: number;
}

interface SpecialA extends BaseA {
  b: number;
}

type A = BaseA | SpecialA

const a = {
    a: 5, b: 5
} as A

console.log(a.b)

我希望代码有效,但我收到错误

Property 'b' does not exist on type 'A'.
  Property 'b' does not exist on type 'BaseA'

似乎类型 A 不是我要定义的类型,我希望它等同于以下类型

interface A {
  a: number;
  b?: number;
}

我的问题是

  1. 为什么我定义的类型 A 与我期望得到的类型 A 不同?
  2. 如何在不手动定义的情况下定义预期的类型 A?

注意:我需要在某些地方使用 SpecialA 类型,因此不定义它而只定义预期的 A 不是一个选项。

最佳答案

由于 A 是联合,您需要 narrow/discriminate您访问非共享成员的类型。

interface BaseA {
  a: number;
}

interface SpecialA extends BaseA {
  b: number;
}

type A = BaseA | SpecialA

const a = {
  a: 5, b: 5
} as A

if ("b" in a) { // narrowing here
  console.log(a.b)
}

Playground

https://stackoverflow.com/questions/72951923/

相关文章:

perl - 如何为每个 XML 输出添加换行符?

node.js - 无法替换到目录/var/lib/docker/overlay2/if2ip5ok

r - 从向量中提取多个子串模式

javascript - 将两个多维数组映射到一个对象中

c - 可变参数在多次转发时如何在堆栈上表示?

html - 在响应图像上放置和缩放文本

r - 在行内的顺序中调整很少的频率来计算频率

javascript - 我怎样才能从传递给 `String.prototype.replace`

c# - 比较两个列表 - 检查一个列表是否包含第二个值

rust - 使用 std::fs::write 将 Vec 写入文件