TypeScript - 如何在TypeScript中省略Enum中的某些项?

时间:2018-02-18 10:39:14

标签: typescript

我定义了一个枚举来澄清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.TagNotFoundNotFoundError.TagNotFound) 。并考虑到 - 当有TagErrcodeNotFoundErrcode时,TagNotFound=203将被定义两次。

2 个答案:

答案 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>;

Typescript Playground

答案 1 :(得分:4)

您首先要定义更细粒度的类型。也许是这样的:

enum ErrorCode {
    Error = 1,
    AccessDeny = 201,
    PostsNotFound = 202,
    TagNotFound = 203,
}

enum SuccessCode {
    Ok = 0
}

然后,您可以将Union Type定义为SuccessCodeErrorCode

type ResultCode = ErrorCode | SuccessCode;

然后您可以像这样使用:

const myResult1: ResultCode = ErrorCode.AccessDeny;
const myResult2: ResultCode = SuccessCode.Ok;