1

以下是重现该问题的示例:

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. 之后,如果它丢失,我将重新分配tmpcurr默认后者为空对象。

现在,如果使用该A || A = B方法,curr逻辑 OR 的左侧将适当缩小为R | undefined. 但是,如果我使用逻辑 OR 分配来使意图更清晰,curr则推断为R | F | undefined. 这显然会导致错误,因为F不可分配给R.

curr问题是 -在第二种情况下失去收窄的原因是什么?

操场

4

1 回答 1

3

在源存储库中将此作为问题提交后,该行为已被确认为错误(更像是设计限制,因为在使用逻辑赋值运算符而不是使用逻辑运算符进行短路赋值时没有进行控制流分析) .

于 2021-06-11T17:14:02.873 回答