typescirpt不理解我的验证功能逻辑

时间:2019-04-09 03:15:35

标签: typescript

你好,我不会检查某些对象或数组为空或未定义或为空 所以我制作了一个util func这样的

const isEmpty = (obj: Array<any> | undefined | null | object): boolean => {
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) return false;
  }
  if (!obj) return true;
  return true;
};

但是看看这个

      if (!isEmpty(houseData)) {
          const { GetAllHouseForSuperUser } = houseData; // ⛔️ error here
      }

打字稿告诉我

Property 'GetAllHouseForSuperUser' does not exist on type 'getAllHouseForSuperUser | undefined'.

但在逻辑上

houseData不能不确定

我怎么注意到打字稿中的houseData不是未定义的?


有关界面的更新

export interface getAllHouseForSuperUser {
  GetAllHouseForSuperUser: getAllHouseForSuperUser_GetAllHouseForSuperUser;
}

export interface getAllHouseForSuperUser_GetAllHouseForSuperUser {
  __typename: 'GetAllHouseForSuperUserResponse';
  ok: boolean;
  error: string | null;
  allHouse: getAllHouseForSuperUser_GetAllHouseForSuperUser_allHouse[] | null;
}

1 个答案:

答案 0 :(得分:0)

TypeScript不会执行跨函数边界的数据流,它假定签名是准确的。这就是为什么在函数内部执行的检查不会传播到外部的原因。

这种情况下有一个功能,type guards。用户可以将它们定义为返回引用其参数之一的特殊类型的函数。在您的情况下,应这样写:

const isEmpty = (obj: Array<any> | undefined | null | object): obj is null | undefined => {
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) return false;
  }
  if (!obj) return true;
  return true;
};

请注意obj is type:这是显示从此函数返回的布尔值在类型级别上具有含义的方式。当然,由您来检查实现是否正确。