Typescript 函数应返回NOTNULL参数的类型

Typescript 函数应返回NOTNULL参数的类型,typescript,Typescript,我有一个接受x和y的函数。其中一个坐标始终为null。另一个总是number。该函数返回非空坐标的值:x或y。该函数始终返回一个数字 function test({ x, y }: { x: null; y: number } | { x: number; y: null }): number { if (x === null) { // y should be recognized as 'number', but it is 'number | null' return

我有一个接受
x
y
的函数。其中一个坐标始终为
null
。另一个总是
number
。该函数返回非空坐标的值:
x
y
。该函数始终返回一个数字

function test({ x, y }: { x: null; y: number } | { x: number; y: null }): number {
  if (x === null) {
    // y should be recognized as 'number', but it is 'number | null'
    return y; // ERROR
  }
  return x;
}


test({x: null, y: 42 }); // 42


是否可以将此函数的返回类型始终保持为
数字?

如果您确定自己的要求,可以尝试以下操作:

function test({ x, y }: { x: null; y: number } | { x: number; y: null }): number {
  return x === null && y !== null ? y : x!;
}
就是所谓的:

一个新的
修复后表达式运算符可用于断言其
操作数在类型为
核查人员无法得出那个事实的结论


目前,TypeScript为
x
y
推断
number | null
,因为它不会考虑它们之间从联合类型派生的任何依赖关系。通过不分解参数对象,您可以稍微简化问题,这将允许TypeScript将其标识为a,并基于对
x
(或
y
)的检查缩小其类型:


它很有效,谢谢!我投你一票!我想知道为什么解构在这里起作用。这是因为
arg
是一个,这是TS中唯一一个检查一个值的类型(判别属性)对其他值(父对象及其其他属性)有影响的地方。如果将结构分解为两个变量,
x
y
,则这些类型将被视为独立的不相关联合类型,检查其中一个对另一个没有影响。我已经备案了,很有效,谢谢!我投你一票!我的eslint有一个问题:
禁止的非空断言。(@typescript eslint/无非空断言)
。谢天谢地,这是一个警告,不是一个错误。不客气。ESLint有时有点烦人。如果要禁用警告,请参阅:)
function test(arg: { x: null; y: number } | { x: number; y: null }): number {
  if (arg.x === null) {
    return arg.y;
  }
  return arg.x;
}