我们可以从函数参数推断泛型类型参数吗?
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
。这将联合缩小到只有具有该状态的选项。
所以代码看起来像这样:
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
。这将联合缩小到只有具有该状态的选项。