TypeScript - TypeScript'te bir Enum'dan bazı öğeleri nasıl çıkarabilirim?


API istek durumunu netleştirmek için bir Enum tanımladım:

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'i, Errcode.Ok dışındaki tüm Errcode öğelerini ifade edecek şekilde (ve NotFoundError'ın tüm öğelerini de içermesi gerekiyor) nasıl tanımlayabilirim?

Daha ayrıntılı türleri tanımlayıp onları böyle birleştiremiyorum:

enum SuccessErrcode {
    Ok =0,
}
enum NotFoundErrcode {
    PostsNotFound=202,
    TagNotFound=203,
}
enum ErrorErrcode {
    Error=1,
}
type Errcode =SuccessErrcode|NotFoundError|SuccessErrcode;

Bunu yaparsam, Errcode.xxx kullanamayacağım - bir kodu kullanmak için, onun nerede atandığını bilmem gerekiyor. (örneğin Errcode.TagNotFound’dan NotFoundError.TagNotFound’a). Ve şunu göz önünde bulundur: TagErrcode ve NotFoundErrcode olduğunda, TagNotFound=203 iki kez tanımlanmış olacak.

Cevap #1

TypeScript 2.8 ve koşullu tiplerin eklenmesiyle, belirli enum değerlerini hariç tutmak için yerleşik Exclude öğesini kullanabilirsiniz:

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 Oyun Alanı

Cevap #2

İlk olarak daha ayrıntılı türleri tanımlarsınız. Belki şöyle bir şey:

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

enum SuccessCode {
    Ok = 0
}

Daha sonra bir Birleşim Tipi'ni ya SuccessCode ya da ErrorCode olacak şekilde tanımlayabilirsiniz:

type ResultCode = ErrorCode | SuccessCode;

bunu sonra şöyle kullanabilirsiniz:

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

İlgili makaleler