我们可以从函数参数推断泛型类型参数吗?

Can we infer generic typed parameter from function's parameter?

所以代码看起来像这样:

enum Status {
  Open = "open",
  Closed = "closed"
}

interface DefaultRequest {
  status: Status
}

interface OpenRequest extends DefaultRequest {
  status: Status.Open;
  data?: Record<string, Status.Open>
}

interface CloseRequest extends DefaultRequest {
  status: Status.Close;
  data?: Record<string, Status.Close>
}

interface MapRequest {
  [Status.Open]: OpenRequest;
  [Status.Close]: CloseRequest;
}

type Request = OpenRequest | CloseRequest;

function isValidRequestType<T extends Status> (data: Request): T is MapRequest[T] {
  return true;
}

isValidRequest<Status.Open>({ status: Status.Open }) //passed argument is typecasted to OpenRequest
isValidRequest({ status: Status.Open }) // passed argument is typecasted to Request

如果我在函数调用时不传递通用参数并且 isValidRequest 是否仍然可以从传递的参数的属性(也称为状态)推断出状态,是否有可能?

类似

function isValidRequestType<T extends Status> (data: Request & {type: T}): T is MapRequest[T] {
  return true;
}
isValidRequest({ status: Status.Open }) // passed argument is OpenRequest??

你很接近,但我想你想要这样的东西:

function isValidRequestType<T extends Status>(
  data: Request & { status: T }
): data is Request & { status: T } {
  return true;
}

当您执行 data is Request & { status: T } 时,您是在说名为 data 的参数是仅包含与 { status: T } 匹配的成员的联合 Request。这将联合缩小到只有具有该状态的选项。

Playground