打字稿自定义类型不能分配给自定义类型

时间:2020-08-24 05:25:41

标签: typescript

让我给你一个例子,使问题变得简单。

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元素。

1 个答案:

答案 0 :(得分:3)

include采用与数组元素相同类型的元素。在这种情况下,该类型为TA。因此,TC(而TATB的并集)可能不是同一类型。

现在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);
});

Playground Link