打字稿提取并创建Union作为Union的子集

时间:2018-12-05 16:52:54

标签: typescript

我具有以下联盟类型;

type MyUnionType = 'foo' | 'bar' | 'baz'

我想创建一个新的联合体MySubUnion作为子集;

type MySubUnion = 'foo' | 'bar'

我希望将MySubUnion限制为其父MyUnionType的值

type MySubUnion = 'foo' | 'bas' // => Error Type String 'b...

2 个答案:

答案 0 :(得分:4)

将并集限制为成分子集为subtyping。在TypeScript中,A extends BAB的子类型的一种说法。 (这有时在某些人看来是倒退的;通过从联合中删除元素,您可以使类型更具体,这是子类型。单词“ extends”可能看起来不合适,但这就是它。) / p>

不幸的是,您不能像使用接口那样使用extends来缩小类型别名。您想使用以下 invalid 语法:

// this is not valid TypeScript, do not use this:
type MySubUnion extends MyUnionType = 'foo' | 'bar'; // should work
type MySubUnion extends MyUnionType = 'foo' | 'bas'; // should fail

但是你不能那样做。作为解决方法,您可以创建一个名为Extends<T, U>的新型函数,其结果为U,但只有在U扩展了T的情况下才能编译,如下所示:

type Extends<T, U extends T> = U;

然后,您可以将无效代码重写为以下有效代码:

type MySubUnion = Extends<MyUnionType, 'foo' | 'bar'>; // okay, compiles

这:

type MySubUnion = Extends<MyUnionType, 'foo' | 'bas'>; // error:
// Type '"bas"' is not assignable to type 'MyUnionType'.

有帮助吗?祝你好运!

答案 1 :(得分:1)

您总是可以翻转声明顺序,尽管这里的特定名称有点奇怪。

type MySubUnion = 'foo' | 'bar';
type MyUnionType = MySubUnion | 'baz';

更多地是在组合类型的组合中。