typescript - 如何缩小可能的类型?
问题描述
我有地图,还有下一个组合:
type MAP = Map<string|symbol, object|symbol>;
但是,可能只有三种组合:
type MAP = Map<string, object> ;
type MAP = Map<symbol, object> ;
type MAP = Map<string, symbol> ;
而且不可能有
type MAP = Map<symbol, symbol> ;
我该如何描述这个?
解决方案
我们可以通过在类型级别使用不同的参数来实现这一点MAP
。为了对两个元素进行分组,最简单的方法是成对传递参数。考虑:
type MAP<Inside extends [string, object] | [symbol, object] | [string, symbol]>
= Map<Inside[0], Inside[1]>;
// using
type MyMapCorrect = MAP<[string, symbol]> // ok
type MyMapError = MAP<[symbol, symbol]> // error as it should
类型MAP
明确定义了允许的对,不允许其他组合。
第二种解决方案是条件类型:
type MAP<First extends string | symbol
, Second extends (First extends string ? object | symbol : object)>
= Map<First, Second>;
// using
type MyMapCorrect = MAP<string, symbol> // ok
type MyMapError = MAP<symbol, symbol> // error as it should
我们定义第一个参数和第二个参数之间的关系。这种方式的好处是没有引入额外的元组,但是代码比较复杂,所以我更喜欢第一种方案。