我试图通过排除类型对象中的一个类型来限制类型,但它从未显示。
我在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