javascript - TypeScript visar aldrig när jag utesluter en typ
Jag försöker begränsa en typ i ett typobjekt genom att utesluta en av dess typer, men det visas som aldrig.
Jag försökte detta i TS-lekplatsen.
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"]
}
Ovanstående scenario fungerar bra. Men när jag ändrar delen Exclude till Exclude<TA['c'], T2[]>
Det visar aldrig för c som visas nedan.
type T3 = Omit<TA, 'c'> & Record<keyof Pick<TA, 'c'>, Exclude<TA['c'], T2[]>>;
// ^? type T3 = Omit<TA, "c"> & Record<"c", never>
Några förslag?
Här är TS Playground-länken som referens -> https://www.typescriptlang.org/play?ts=5.0.2#code/C4TwDgpgBAKgjFAvFAogDwMYBsCuATCAHgCIBDYqAHymICMLriNiAaG8qm+gPgG4AoAPSCooqAD0A-P1CRYAJiSpMuAoQDOwAE4BLAHYBzTnpwBbWhC2cAFNYCUSblABuAex147bAGI49GYB1XPT4hETEpfhlwaBgAQSUAbyhSAC4oTV1DNlp0k3NLNgx0+ABtAF1OGHkKqABfKNlYgGYlAHlTHWBCeLYAcgw+pwAyKAAlCAxXLTxCAGsIEFcAMygABR0MOZ64-sHuNnRsfCJ40oG+8rZqiu5Q4TEJaX4pvU0oUxA22gArEtbkIl+I9SFBUn0+ixgWJclAAAxQx7FKClJjEcr8OpAA
Svar #1
Detta är förväntat eftersom i slutändan blir Exclude<TA['c'], T2[]> till Exclude<T1[] | T2[], T2[]>.
T2[] utesluts från T1[] | T2[] så du får Exclude<T1[], T2[]>
T1[] är "c"[] och T2[] är mängden av (string|number)[] som täcker "c"[] så allt blir exkluderat och du slutar med never
"c"[] kan tilldelas (string|number)[] så Exclude<"c"[], (string|number)[]> är aldrig