在hasOwnProperty检查之后,typescript仍然会抱怨

在hasOwnProperty检查之后,typescript仍然会抱怨,typescript,Typescript,有一种是这样的 export type PathType = | LivingstoneSouthernWhiteFacedOwl | ArakGroundhog | HubsCampaigns | HubsCampaignsItemID | HubsAlgos | HubsAlgosItemID | TartuGecko | HammerfestPonies | TrapaniSnowLeopard | BeijingPigeon | Link

有一种是这样的

export type PathType =
  | LivingstoneSouthernWhiteFacedOwl
  | ArakGroundhog
  | HubsCampaigns
  | HubsCampaignsItemID
  | HubsAlgos
  | HubsAlgosItemID
  | TartuGecko
  | HammerfestPonies
  | TrapaniSnowLeopard
  | BeijingPigeon
  | Link
  | LinksMhdSwsVisordeltas
  | MetadatahandlingName
  | MetadatahandlingGetmetadataSequencesNameSequenceNameLabelNameLabelName;
这些是开放API定义路径的接口

我需要写一个这样的函数

import { PathType } from '../types/path.type';

const makeFormJSONSchema = (path: PathType) => {
  const schema = {};
  // 1. If there are any `parameters` put them into the schema
  if (path.hasOwnProperty('parameters')) {
    path.parameters;
  }
  // 2. then peek at the method object by the `method` prop
  // 3. Check for additional `parameters` and put into the schema
  // 4. Check for `requestBody` and put into the schema

  return schema;
};

export default makeFormJSONSchema;
如您所见,我检查
路径
对象是否获得
参数
属性,然后尝试访问它

然而,typescript给出了一个错误


我们如何告诉typescript我们得到了这个?

由于PathType是联合类型,您只能访问其所有联合类型的公共属性的属性。 因此,您需要定义一个类型保护,它将以某种方式确保Typescript对象是给定类型的

让我们假设Beijing鸽子和TartuGecko都包含属性“参数”

创建类型保护:

function isBeijingPigeon(val: PathType): val is BeijingPigeon {
    return (val as BeijingPigeon).parameters !== undefined;
}
function isTartuGecko (val: PathType): val is TartuGecko {
    return (val as TartuGecko).parameters !== undefined;
}
然后,无论何时需要访问parameters属性,请执行以下操作:

if (isBeijingPigeon(pathObject) || isTartuGecko(pathObject) {
   // access to pathObject.parameters won't cause any errors
}

由于PathType是联合类型,因此只能访问其所有联合类型的公共属性的属性。 因此,您需要定义一个类型保护,它将以某种方式确保Typescript对象是给定类型的

让我们假设Beijing鸽子和TartuGecko都包含属性“参数”

创建类型保护:

function isBeijingPigeon(val: PathType): val is BeijingPigeon {
    return (val as BeijingPigeon).parameters !== undefined;
}
function isTartuGecko (val: PathType): val is TartuGecko {
    return (val as TartuGecko).parameters !== undefined;
}
然后,无论何时需要访问parameters属性,请执行以下操作:

if (isBeijingPigeon(pathObject) || isTartuGecko(pathObject) {
   // access to pathObject.parameters won't cause any errors
}

这正好回答了这个问题,谢谢。不过我想指出一个微妙的问题。这也是一个设计问题。为了实现此函数,最好使用正确抽象的接口而不是联合类型。在开放API的情况下,这里的类型会很有帮助,我同意,创建一个包含十几个或更多类型的联合类型不会产生如此清晰的代码,它应该以不同的方式完成。但是我还没有看到您的代码的其余部分,所以您可能被迫这样做。总有一个我们作为读者不知道的背景。这回答了一个确切的问题,谢谢。不过我想指出一个微妙的问题。这也是一个设计问题。为了实现此函数,最好使用正确抽象的接口而不是联合类型。在开放API的情况下,这里的类型会很有帮助,我同意,创建一个包含十几个或更多类型的联合类型不会产生如此清晰的代码,它应该以不同的方式完成。但是我还没有看到您的代码的其余部分,所以您可能被迫这样做。总有一个我们作为读者一无所知的背景。