我定义了一个枚举来澄清API请求状态:
const enum Errcode{
Ok=0,
Error=1,
AccessDeny=201,
PostsNotFound=202,
TagNotFound=203,
//...
}
type SuccessErrcode =Errcode.Ok;
type NotFoundError =Errcode.PostsNotFound|Errcode.TagNotFound;
type ErrorErrcode=/* there */;
如何定义ErrorErrcode
,这意味着除Errcode.Ok之外的所有Errcode项(并且它应包括NotFoundError的所有项)?
我无法定义更细粒度的类型,Union他们喜欢这样:
enum SuccessErrcode {
Ok =0,
}
enum NotFoundErrcode {
PostsNotFound=202,
TagNotFound=203,
}
enum ErrorErrcode {
Error=1,
}
type Errcode =SuccessErrcode|NotFoundError|SuccessErrcode;
如果我这样做,我将无法使用Errcode.xxx
- 使用代码,我必须知道它的分配位置。(例如从Errcode.TagNotFound
到NotFoundError.TagNotFound
) 。并考虑到 - 当有TagErrcode
和NotFoundErrcode
时,TagNotFound=203
将被定义两次。
答案 0 :(得分:7)
从TypeScript 2.8开始,并添加了条件类型,您可以使用内置的Exclude
排除某些枚举值:
const enum Errcode {
Ok=0,
Error=1,
AccessDeny=201,
PostsNotFound=202,
TagNotFound=203,
//...
}
type SuccessErrcode = Errcode.Ok;
type NotFoundError = Errcode.PostsNotFound|Errcode.TagNotFound;
type ErrorErrcode = Exclude<Errcode, Errcode.Ok>;
答案 1 :(得分:4)
您首先要定义更细粒度的类型。也许是这样的:
enum ErrorCode {
Error = 1,
AccessDeny = 201,
PostsNotFound = 202,
TagNotFound = 203,
}
enum SuccessCode {
Ok = 0
}
然后,您可以将Union Type定义为SuccessCode
或ErrorCode
:
type ResultCode = ErrorCode | SuccessCode;
然后您可以像这样使用:
const myResult1: ResultCode = ErrorCode.AccessDeny;
const myResult2: ResultCode = SuccessCode.Ok;