首页 > 解决方案 > 我们可以从函数的参数中推断出泛型类型参数吗?

问题描述

所以代码看起来像这样:

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??

标签: typescriptcastingtype-conversiontypescript-typingstypescript-generics

解决方案


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

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

当您这样做时,data is Request & { status: T }您是在说名为的参数是仅具有匹配成员data的联合。这会将联合范围缩小到仅具有该状态的选项。Request{ status: T }

操场


推荐阅读