当我排除一个类型时, Typscript显示never



我试图通过排除类型对象中的一个类型来限制类型,但它从未显示。

我在TS Playground里试过了。

type T1 = Exclude<"a" | "b" | "c", "a" | "b">;
//    ^? type T1 = "c"
type T2 = Exclude<string | number | (() => void), Function>;
//    ^? type T2 = string | number
type TA = { a: string, b: number, c: T1[] | T2[] }
type T3 = Omit<TA, 'c'> & Record<keyof Pick<TA, 'c'>, Exclude<TA['c'], T1[]>>;
//    ^? type T3 = Omit<TA, "c"> & Record<"c", T2[]>
const myObj: T3 = {
a :'',
b: 0,
c: ["c"]
}

上面的场景可以正常工作。但是当我把Exclude部分改成Exclude<TA['c'], T2[]>

在c中显示never,如下图所示。

type T3 = Omit<TA, 'c'> & Record<keyof Pick<TA, 'c'>, Exclude<TA['c'], T2[]>>;
//    ^? type T3 = Omit<TA, "c"> & Record<"c", never>

有什么建议吗?

这里是TS Playground的链接供参考->https://www.typescriptlang.org/play?ts=5.0.2代码/C4TwDgpgBAKgjFAvFAogDwMYBsCuATCAHgCIBDYqAHymICMLriNiAaG8qm + gPgG4AoAPSCooqAD0A-P1CRYAJiSpMuAoQDOwAE4BLAHYBzTnpwBbWhC2cAFNYCUSblABuAex147bAGI49GYB1XPT4hETEpfhlwaBgAQSUAbyhSAC4oTV1DNlp0k3NLNgx0 + ABtAF1OGHkKqABfKNlYgGYlAHlTHWBCeLYAcgw + pwAyKAAlCAxXLTxCAGsIEFcAMygABR0MOZ64-sHuNnRsfCJ40oG + 8 rzqiu5q4tejax4pvu0ouxa22garetbkil + I9SFBUn0 + ixgWJclAAAxQx7FKClJjEcr8OpAA

这是预期的,因为在最后Exclude<TA['c'], T2[]>下降到Exclude<T1[] | T2[], T2[]>

T2[]被排除在T1[] | T2[]之外,所以你最终得到Exclude<T1[], T2[]>

T1[]"c"[]T2[](string|number)[]的集合包括"c"[]所以所有内容都被排除在外最后得到never

"c"[]可分配给(string|number)[]所以Exclude<"c"[], (string|number)[]>never

相关内容

  • 没有找到相关文章

最新更新