让我给你一个例子,使问题变得简单。
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
元素。
答案 0 :(得分:3)
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);
});