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;
}