【发布时间】:2021-04-17 19:16:03
【问题描述】:
我正在尝试定义一个使用具有两个属性的泛型的类型/接口(在本练习中不关心哪个):
interface Response<T> {
status: number;
data: T | undefined;
}
我要捕获的限制是当状态!== 200 时,数据必须是未定义的。当 status === 200 时,data 必须是 T。这样,在我检查以确保 response.status 为 200 之后,我不必总是检查 response.data 是否未定义:
if (response.status === 200 && response.data) {
// Wouldn't it be nice it TS just knew that response.data is
// not undefined without having to check it explicitly?
}
到目前为止,我有这个:
interface IOkResponse<T> {
status: 200;
data: T;
}
interface IErrorResponse {
status: number;
data: undefined;
}
type Response<T> = IOkResponse<T> | IErrorResponse;
当然,由于 IErrorResponse 不会将状态限制为不是 200 的数字,因此这是行不通的。我将如何添加该限制?
【问题讨论】:
-
不理想,但您可以列出您支持的所有其他状态。只有大约 60 个,所以不是世界末日。
-
如果没有更好的方法,这就是我打算做的:)
-
TypeScript 不支持否定类型(它曾经是worked on 并最终被放弃),所以没有办法说“
number & not 200”。如果您的类型是 string"200",则可以通过编程方式生成从"100"到"599"的所有三位字符串文字,并在 TS4.1 中排除"200",但如果您想要数字文字最好只在手动联合中枚举有效代码。如果您对字符串文字版本感兴趣,请告诉我。 -
@jcalz 顺便说一句,我怎么能联系到你?我给你写了一封电子邮件,但我不确定你是否阅读了它
-
@KMehta 请参阅this playground link 了解更多信息
标签: typescript typescript-generics