typescript 打字错误:类型"A"上不存在属性"a"

h6my8fg2  于 2023-02-14  发布在  TypeScript
关注(0)|答案(1)|浏览(227)

下面是我所拥有的类型的一个示例

type Place = {
   address: string
}

type Location = {
   latLng: string
}

type User = {
  name: string
} & (Place | Location)

所以当我试图在解析数据时使用它

const { name, address, latLng } = user;

它显示TS错误类型“User”上不存在属性“address”
从技术上讲,我知道地址或latLng将出现,但不是两者都出现,这是我需要的,我的逻辑将在解析数据时验证它。但如何让TS知道这一点,并删除此错误?

pkwftd7m

pkwftd7m1#

这是使用never的一个很好的地方。这允许您设置User的两个“配置”,它们将具有Place或Loc。Place类型强制执行未定义的latLng,而Loc类型强制执行未定义的地址。User是({name: string} & Place) | ({name: string} & Loc)中的一个,因此尽管所有三个字段都存在于联合体中的两种类型中,地址或latLng将基于另一个的存在而未定义。

type Place = {
  address: string;
  latLng?: never;
};

type Loc = {
  latLng: string;
  address?: never;
};

type User = {
  name: string;
} & (Place | Loc);

function test1() {
  // Valid, latLng is undefined
  const user: User = { name: "User", address: "1234 Somewhere St" };
  const { address, latLng, name } = user;
}

function test2() {
  // Valid, address is undefined
  const user: User = { name: "User", latLng: "123,456" };
  const { address, latLng, name } = user;
}

function test3() {
  // Invalid, both address and latLng are present
  const user: User = {
    name: "User",
    latLng: "123,456",
    address: "1234 Somewhere St",
  };
  const { address, latLng, name } = user;
}

(Playground链接)
这给了你一个类型,它可以定义addresslatLng,但不能同时定义两者。你可以从user中解构出这两个值,但其中一个是未定义的。

相关问题