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

pea*_*nut 16 typescript

我定义了一个Enum来阐明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 */;
Run Code Online (Sandbox Code Playgroud)

如何定义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;
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我将不能使用Errcode.xxx-使用的代码,我必须知道它在哪里被分配的(例如,从,Errcode.TagNotFoundNotFoundError.TagNotFound).并考虑到 - 当有TagErrcode和时NotFoundErrcode,TagNotFound=203将定义两次.

use*_*234 23

从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>;
Run Code Online (Sandbox Code Playgroud)

打字稿游乐场

  • 有没有什么方法可以让结果值也是枚举而不是类型? (7认同)

Ste*_*t_R 5

首先,您将定义更精细的类型。也许是这样的:

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

enum SuccessCode {
    Ok = 0
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将Union Type定义为a SuccessCode或a ErrorCode

type ResultCode = ErrorCode | SuccessCode;
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样使用它:

const myResult1: ResultCode = ErrorCode.AccessDeny;
const myResult2: ResultCode = SuccessCode.Ok;
Run Code Online (Sandbox Code Playgroud)