• Jack Q
    2024-06-01 来自广东
    interface A { a: string; } interface B { a: string; b: boolean; } type B1 = { a: string; b: boolean; } type B2 = B; interface C { a: string; c: number; } // & (交叉会不断的向never 方向收敛) type AB = A & B; type KAB = keyof AB; type ABS0 = AB & string; // 因为无法得到更具体的类型, 所以延迟求值 type ABS0IsNever = never extends ABS0 ? ABS0 extends never ? true : false : false;// false (ABS0 不是never) const abs0 = Object.assign("1" as string, { a: '1', b: true }); type TABS0 = typeof abs0; type ABS0IsTABS0 = ABS0 extends TABS0 ? TABS0 extends ABS0 ? true : false : false;// true type ABS1 = AB | string; // 求值发生了延迟 // | (联合 会不断的向any 方向合并) type D = A; type E = B; type DE = D | E;// 求值发生了延迟;当联合类型无法完成求值,惰性求值就无法得到具体结果,依然会是一个联合类型 type KDE = keyof DE; // keyof DE 等同于keyof D & keyof E; type KDE1 = keyof D & keyof E; type DE1 = DE | { a: boolean };// 求值发生了延迟 type DE2 = DE & { a: boolean };// 等同于 D & { a: boolean } | E & { a: boolean } -> never | never -> never type DE3 = DE1['a']; // 等同于 DE['a'] | { a: number }['a'] -> D['a'] | E['a'] | { a: number }['a'] // 问题1:KAB 此处求值发生了延迟, KBC 却立即求值的原因是? // 根据现象,我自己的猜想是: // KAB 发生交叉后 它的类型等同于 具名的单类型 interface B, KBC 交叉后 它的类型 没有对应的 具名单类型存在, 所以立即求值 type BC = B & C; type KBC = keyof BC; // 猜测证明: type AB0 = A & { a: string; b: boolean; }; type AB1 = A & B1; type AB2 = A & B2; type KAB0 = keyof AB0;// "a" | "b"; 立即求值; AB0 中 & 的右侧类型是一个 匿名的对象类型 ,没有对应的具名单类型存在 type KAB1 = keyof AB1;// keyof B1; 求值发生了延迟; AB1 中 & 的右侧类型是一个 匿名的对象类型的类型别名,类型推导到了别名 type KAB2 = keyof AB2;// keyof B; 求值发生了延迟; AB2 中 & 的右侧类型是一个 接口类型的类型别名, 类型推导到了别名的来源
    展开
    
    