如何键入具有条件存在的成员的替代类型?

问题描述

我有一个返回这种类型结果的 API:

{ "success": true,"result": {} } // on success
{ "success": false,"message": "nope!" } // on failure

我尝试像这样创建替代类型:

interface ResultSuccess<T> {
  success: true;
  result: T;
}
interface ErrorMessage {
  success: false;
  message: string;
}
type Maybe<T> = ResultSuccess<T> | ErrorMessage;

function HandleAPICall(response: Maybe<APIResult>) {
  if (response.success) {
    DoSomething(response.result);
  } else {
    console.log(response.message);
  }
}

但是在 console.log 语句中,我收到如下错误

Error   TS2339  (TS) Property 'message' does not exist on type 'Maybe<APIResult>'.
  Property 'message' does not exist on type 'ResultSuccess<number>'.
\maybe.ts   15  Active

如何从 Maybe 获取 ErrorMessage?

解决方法

您需要在您的 strictNullChecks 中启用 tsconfig.json (docs) 才能使布尔属性的可区分联合工作。