typescript - 我们可以从函数的参数中推断出泛型类型参数吗?
问题描述
所以代码看起来像这样:
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
的联合。这会将联合范围缩小到仅具有该状态的选项。Request
{ status: T }
推荐阅读
- numpy - 将 x,y 值添加到 numpy 矩阵
- javascript - 反应钩子第一次没有设置状态
- go - golang 导入 github 私有仓库
- swift - self.userUid = user.user.uid 方法仍然不能在 Swift 中工作
- html - 计算器 HTML
- c# - 使用 c# 动态创建 HTML 表格行
- sharepoint - 如何在共享点中获取> 5000个文件
- swift - 如何获得绘制 NSMutableAttributedString 所需的矩形的估计大小?
- angular - 带有 ng-content -> form.valid/dirty 等的 Angular 表单不起作用
- apache-spark - Spark 应用程序如何访问 Amazon S3 存储桶中的文件/目录?