Typescript 空|数字不可分配给数字(即使在确保它不可能为空后)

Typescript 空|数字不可分配给数字(即使在确保它不可能为空后),typescript,Typescript,在一些简短的教程开始转换应用程序之前和之后,我从未使用过Typescript。大多数情况下,它运行得很顺利,但在某些情况下,我觉得TS不理解代码。这是我无法理解的最新情况: interface APIresponse { someProp: number | null } interface parsedAPIresponse { someProp: number } let apiResponse: APIresponse = { someProp: null } function par

在一些简短的教程开始转换应用程序之前和之后,我从未使用过Typescript。大多数情况下,它运行得很顺利,但在某些情况下,我觉得TS不理解代码。这是我无法理解的最新情况:

interface APIresponse { someProp: number | null }
interface parsedAPIresponse { someProp: number }

let apiResponse: APIresponse = { someProp: null }

function parseAPIresponse(response: APIresponse): parsedAPIresponse {
    response.someProp = 1
    return response
}
。。。TS抱怨返回值不兼容,number | null不可分配给number,即使将值1分配给它

我要做的是解析来自API的响应。API返回number | null,对此我无能为力,但我在应用程序中避免使用null,所以我尝试解析API响应并转换null

不确定如何编写此代码,并完全避免在应用程序的API层之后出现空值。

这是可行的(例如,请参见中的):

在本例中,我们创建了一个具有正确返回类型的新对象,并返回这个对象,以便TypeScript理解它是预期的正确返回类型

为了确保
number
字段确实不是空的,我在这里选择使用默认值
0
,当然也可能有其他方法(如果值不是数字,可以抛出异常,或者使用另一个默认值,如
NaN
等)。

这是有效的(例如,请参见中的内容):

在本例中,我们创建了一个具有正确返回类型的新对象,并返回这个对象,以便TypeScript理解它是预期的正确返回类型


为了确保
number
字段确实不是空的,我在这里选择使用默认值
0
,当然可能还有其他方法(如果值不是数字,可以抛出异常,或者使用另一个默认值,如
NaN
等)。

在这种情况下,我认为需要使用另一个变量(类型为
parsedAPIresponse
并使用某种类型的typeguard.
if(response.someProp是number)parseResponse.someProp=response.someProp
.Pr使用默认值,等等…任何可以保证解析的prop是一个数字且不为null的东西,例如,这也可以工作:
parsedResponse.someProp=response.someProp | 0
null
/
未定义的
respo使用默认的0回退值nse
在技术上仍然是一个
APIresponse
,您只需将
someProp
修改为等于
1
。类型检查在Typescript中是近似的。另请参见此问题:。在这种情况下,我认为您需要使用另一个变量(类型
parsedAPIresponse
),并使用某种类型的typeguard。
(response.someProp是数字)parseResponse.someProp=response.someProp
.Pr使用默认值,等等…任何可以保证解析的prop是一个数字且不为null的东西,例如,这也可以工作:
parsedResponse.someProp=response.someProp | 0
null
/
未定义的
respo使用默认的0回退值nse
在技术上仍然是一个
APIresponse
,您只需将
someProp
修改为等于
1
。类型检查在Typescript中是近似的。另请参阅此问题:。是的,谢谢。在我的真实代码中,我没有使用接口,但很快就内联声明了类型,这使我避免了在解析时再次使用相同的类型响应。但是这个简化的解决方案确实很清楚。是的,谢谢。在我的实际代码中,我没有使用接口,而是快速声明了内联类型,这使我避免了在parsedResponse中再次使用相同的类型。但是这个简化的解决方案确实很清楚。
function parseAPIresponse(response: APIresponse): parsedAPIresponse {
    let parsedResponse: parsedAPIresponse = {
        someProp: response.someProp || 0,
    };
    return parsedResponse;
}