我具有以下联盟类型;
type MyUnionType = 'foo' | 'bar' | 'baz'
我想创建一个新的联合体MySubUnion
作为子集;
type MySubUnion = 'foo' | 'bar'
我希望将MySubUnion
限制为其父MyUnionType
的值
type MySubUnion = 'foo' | 'bas' // => Error Type String 'b...
答案 0 :(得分:4)
将并集限制为成分子集为subtyping。在TypeScript中,A extends B
是A
是B
的子类型的一种说法。 (这有时在某些人看来是倒退的;通过从联合中删除元素,您可以使类型更具体,这是子类型。单词“ 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';
更多地是在组合类型的组合中。