首页 > 解决方案 > 可以在 Typescript 中的数组联合上安全地调用 Array.map 吗?

问题描述

使用数组类型的联合(不是联合数组,例如Foo[] | Bar[]not (Foo|Bar)[]),是否可以在联合上调用类似 Array.prototype.map 的内容,以安全地将每个联合变体映射到具有相同类型的新值(例如,相同的变体,但可能会更改某些字段等)。

这是一个例子:

type HomogenousLetters = 'a'[] | 'b'[];
const array: HomogenousLetters = ['a', 'a', 'a'] as HomogenousLetters;

现在,假设我们想在这个数组和同一个 union 变体之一之间进行映射。我们可能想调用Array.prototype.map,但即使在微不足道的情况下也无法编译。

// ERROR: Type '("a" | "b")[]' is not assignable to type '"a"[] | "b"[]'.
const mappedArray: HomogenousLetters = array.map((letter) => letter);

我理解这是合理的行为 - Array.prototype.map() 的类型签名不能保证同质输入会产生同质输出(即数组中的每个“字母”都将具有相同的联合变体),但在这种情况下,我们如何确保这一点?

标签: arraystypescriptunionstype-narrowing

解决方案


推荐阅读