TypeScript 有没有办法说“包含”(与排除相反)?

Wil*_*ely 7 strong-typing typescript reactjs angular

我有一个字符串联合,看起来像: type AlphabetLike = 'a' | 'b' | 'c' | 'zeta' | 'beta' | 'gamma' | 'mu'; 我希望能够构造类型 type Alphabet = 'a' | 'b' | 'c'。我可以通过使用排除并删除 zeta、beta、gamma 和 mu 来做到这一点,但是需要删除很多东西,如果向 AlphabetLike 添加更多值,它会更改 Alphabet。我想知道我的“AlphabetLike”值是否已从该类型中删除。

有没有办法进行包含而不是排除?

jca*_*alz 11

有一种Extract<T, U>实用程序类型,其行为与实用程序Exclude<T, U>类型相反:

type AlphabetLike = 'a' | 'b' | 'c' | 'zeta' | 'beta' | 'gamma' | 'mu';

type Alphabet = Extract<AlphabetLike, 'a' | 'b' | 'c' | 'zzz'>;
// type Alphabet = "a" | "b" | "c"
Run Code Online (Sandbox Code Playgroud)

请注意,没有任何东西强制第二个参数(U此处调用)Extract<T, U>只能Exclude<T, U>包含第一个参数(T此处调用)中的元素。因此,'zzz'上述内容不会对任何事情产生影响。

Playground 代码链接


Wil*_*ely 0

两个“排除”可以充当包含。

首先,如果您使用排除,则创建要排除的所有项目的列表。

type GreekAlphabet = Exclude<AlphabetLike, 'a' | 'b' | 'c'>
Run Code Online (Sandbox Code Playgroud)

这会产生一个集合: 'zeta' | 'beta' | 'gamma' | 'mu' 我们可以将该集合与 Exclude 结合使用来返回我们想要的值:

type Alphabet = Exclude<AlphabetLike, GreekAlphabet>
Run Code Online (Sandbox Code Playgroud)

这会导致: 如果从“AlphabetLike”中删除正在使用的选项,'a' | 'b' | 'c' 这将有效地保护您。Include<AlphabetLike, 'a'|'b'|'c'>