让我给你一个例子来简化这个问题。
type TA = 1 | 2;
type TB = 3 | 4;
type TC = TA | TB;
const a: TA[] = [1, 2];
const b: TC[] = [1, 2, 3, 4];
b.forEach((e) => {
a.includes(e);
^^^
});
TC
类型的参数不可分配给TA
类型的参数。类型3
不可分配给类型TA
。
我知道它不起作用的原因,但我找不到任何解决方案来检查a
是否包含e
元素。
include
采用与数组元素类型相同的元素。在这种情况下,该类型为TA
。因此TC
(而TA
和TB
的并集(可能不是同一类型。
现在include
是一种特殊情况,而在数字数组的情况下,我们可能不想允许字符串被传递到include中,在文字类型并集的情况下我们实际上希望能够传递一个可能是数组中某个文字类型的参数,因为测试存在性实际上是include
所做的。不幸的是,TS没有一种方法可以轻松地建模"如果数组元素是文字类型,则允许在中传递基类型">
这里最简单、最有针对性的解决方案是类型断言:
type TA = 1 | 2;
type TB = 3 | 4;
type TC = TA | TB;
const a: TA[] = [1, 2];
const b: TC[] = [1, 2, 3, 4];
b.forEach((e) => {
a.includes(e as TA);
});
游乐场链接