TypeScript 中使用联合类型时如果像下面的代码这样写,会发现 BaseType 的类型与预期的并不一致

type BaseType = unknown | string | number;

image.png

BaseType 的预期类型应该为三种类型的联合类型,但是真正的类型却只有 unknown 类型。

原因是因为在 TypeScript 中,所有的类型都扩展了 unknown 类型,因为 BaseType的类型就会被简化为 unknown类型。

可以使用TypeScript可区分联合类型 来解决

type BaseUnknown = { type: 'unknown' };
type BaseString = { type: 'string' };
type BaseNumber = { type: 'number' };
 
type BaseType = BaseUnknown | BaseNumber | BaseString;
 
type Infer<T extends BaseType> = T extends BaseUnknown
  ? unknown
  : T extends BaseString
  ? string
  : T extends BaseNumber
  ? number
  : 'invalid type';
 
type U = Infer<BaseUnknown>;
type S = Infer<BaseString>;
type N = Infer<BaseNumber>;

Infer的逻辑为: 检查 T 是否是 BaseUnkown, 如果是,则返回 unkown类型,否则判断是否是 BaseString 类型,依次类推