以下是重现该问题的示例:
type F = () => number;
type R = {
[ x: string ]: R | F | undefined
}
const isFunc = <T extends (...args: any[]) => any>(maybe:unknown) : maybe is T => typeof maybe === "function";
const check = (i: R) => {
let tmp:R = i;
let curr = tmp["something"];
if( isFunc<F>(curr) ) return;
curr // R | undefined, expected
tmp = curr || (curr = {}); //ok, expected
tmp = curr ||= {}; //Index signature is missing in type 'F'
};
如您所见,在类型保护之后,curr
正确地缩小为R | undefined
. 之后,如果它丢失,我将重新分配tmp
并curr
默认后者为空对象。
现在,如果使用该A || A = B
方法,curr
逻辑 OR 的左侧将适当缩小为R | undefined
. 但是,如果我使用逻辑 OR 分配来使意图更清晰,curr
则推断为R | F | undefined
. 这显然会导致错误,因为F
不可分配给R
.
curr
问题是 -在第二种情况下失去收窄的原因是什么?