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