首页 > 解决方案 > 如何从联合中获取“可选”属性?

问题描述

这就是我想要实现的目标:

interface Point2d {
  x: number;
  y: number;
}

interface Point3d {
  x: number;
  y: number;
  z: number;
}

type Point = Point2d | Point3d;

const p: Point = getPoint();
const z: number | undefined = p.z;

但是,这是不可能的:TypeScript 将在z未定义的最后一行出错Point2d。有什么办法可以使这项工作?

标签: typescriptunion-types

解决方案


您可以使用类型保护来检查 z 的存在,例如

const p: Point = getPoint();
const z: number | undefined = ('z' in p) ? p.z : undefined; 

你可以在这里看到一个例子。

或者您可以使用以下功能使其更通用:

const get = (point: Point, prop: string): number => prop in point ? point[prop] : undefined

in关键字实际上是一个 javascript 运算符,但它经常用于 typescript 中的此类场景(例如,请参见此处的一个很好的示例


推荐阅读