首页 > 解决方案 > 如何缩小可能的类型?

问题描述

我有地图,还有下一个组合:

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> ;

我该如何描述这个?

标签: typescript

解决方案


我们可以通过在类型级别使用不同的参数来实现这一点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

我们定义第一个参数和第二个参数之间的关系。这种方式的好处是没有引入额外的元组,但是代码比较复杂,所以我更喜欢第一种方案。

两种解决方案的游乐场


推荐阅读