更窄的类型不能分配给其他类型

2024-04-29

有两种类型:

type ExcludeString<T = any> = Exclude<T, string>;
type ExcludeStringAndBoolean<T = any> = Exclude<T, string | boolean>;

在函数的代码中

function test1<T>(p: ExcludeStringAndBoolean<T>) {
  let a: ExcludeString<T>;
  a = p;
}

tsc 抛出行错误a = p

Type 'Exclude<T, string | boolean>' is not assignable to type 'Exclude<T, string>'.ts(2322)

但对于某些用途来说它效果很好:

type CertainType = string | number | boolean;

function test2(p: ExcludeStringAndBoolean<CertainType>) {
  let a: ExcludeString<CertainType>;
  a = p;
}

为什么会这样呢?


Exclude是一个条件类型。如果条件类型包含未解析的类型参数(例如T) typescript 不会尝试对条件类型进行太多推理。因此可分配性规则变得相当严格。

For Exclude,如果第二个参数不同(即测试的类型不同),则可分配性检查失败(例如string | boolean vs string在你的情况下)。如果第一个参数(即被测试的类型)具有类型关系,则赋值成功。例如,这将起作用:

type ExcludeString<T = any> = Exclude<T, string>;
type ExcludeStringAndBoolean<T = any> = Exclude<T, string | boolean>;

function test1<T extends U, U>(p: ExcludeString<T>) {
  let a: ExcludeString<U>;
  a = p;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更窄的类型不能分配给其他类型 的相关文章

随机推荐