gpt4 book ai didi

Typescript 除 X 以外的任何数字

转载 作者:行者123 更新时间:2023-12-05 02:41:40 24 4
gpt4 key购买 nike

简单描述:

这种类型在 TS 中是否可行? Exclude<number, 200 | 400> (“除 200 或 400 之外的任何数字”)

我有以下用例。我有一个通用的响应类型:

type HttpResponse<Body = any, StatusCode = number> = {
body: Body
statusCode: StatusCode
}

我想使用状态码作为鉴别器:

// Succes
type SuccessResponse = HttpResponse<SomeType, 200>
// Known error
type ClientErrorResponse = HttpResponse<ClientError, 400>
// Anything else, generic error, issue is with the status code here.
type OtherErrorResponse = HttpResponse<GenericError, Exclude<number, 200 | 400>>

// The response type is a union of the above
type MyResponse = SuccessResponse | ClientErrorResponse | OtherErrorResponse

当我使用 MyResponse类型,我想使用状态代码作为鉴别器,例如:

const response: MyResponse = ...

if(response.statusCode === 200) {
// response is inferred as SuccessResponse => body is inferred as SomeType
} else if(response.statusCode === 400) {
// response is inferred as ClientErrorResponse => body is inferred as ClientError
} else {
// response is inferred as OtherErrorResponse => body is inferred as GenericError
}

但是它不像这样工作 Exclude<number, 200 | 400>number 相同.我该如何解决这个问题?是类型 "any number except 200 or 400" typescript 可能吗?还有其他创造性的解决方案吗?

最佳答案

目前这是不可能的。

参见:https://github.com/microsoft/TypeScript/issues/15480


Exclude<number, 200 | 400>不起作用,因为 typescript 只跟踪某物是什么,而从不跟踪它不是什么。为了从无限系列中排除某些值, typescript 必须生成一个包含每个可能值的联合,除了您希望排除的值。这将是无限长度的并集(因为无穷大减 2 等于无穷大)


也就是说,http 状态代码的列表实际上是有限的。所以最好的方法可能是创建所有可能值的并集并使用它:

type HTTPStatusCode = 100 | 101 | 102 | 103 | 200 | 201 | 202 | ...

现在应该可以正常工作了:

Exclude<HTTPStatusCode, 200 | 400>

关于Typescript 除 X 以外的任何数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68008673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com