TypeError: Cannot read property 'toString' of null
我认为类型转换将自动完成,这不是这里的情况。
所以我的问题是这种类型的作业有更好的方法
此外,如果obj.input1为null,则此变通方法失败。
obj.input1
然后我应该检查Is there "automatic" type cast in typescript
是否为空
注意:我编辑了标题为<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'><s:ElementType name='row' content='eltOnly' rs:updatable='true'>
<s:AttributeType name='Column1' rs:number='0'>
<s:datatype dt:type='string' dt:maxLength='4294967295' rs:long='true'/>
</s:AttributeType>
<s:AttributeType name='Column2' rs:number='1'>
<s:datatype dt:type='string' dt:maxLength='4294967295' rs:long='true'/>
</s:AttributeType><s:AttributeType name='Column3' rs:number='2'>
<s:datatype dt:type='string' dt:maxLength='4294967295' rs:long='true'/>
</s:AttributeType>
</s:Schema>
<rs:data>
<z:row Column1 = "ABC" Column2 = "DEF" Column3 = "GHI"/>
<z:row Column1 = "JKL" Column2 = "MNO" Column3 = "PQR"/>
</rs:data>
</xml>
以表达更明确的问题
答案 0 :(得分:4)
以下代码处理非数字,空字符串,未定义变量,空变量和偶数。它为所有“错误”情况提供默认值0。
objToSendServer.input1 = +obj.input1 || 0;
这是一个简化的演示。它显示了四个可能的输入(字符串或数字),然后使用slacker parsing来获取值。
var a: string | number = "1";
var b: string | number = 2;
var c: string | number;
var d: string | number = "A";
var w: number = +a || 0;
alert(w); // 1
var x: number = +b || 0;
alert(x); // 2
var y: number = +c || 0;
alert(y); // 0
// It even infers the `number` type:
var z = +d || 0;
alert(z); // 0
如果您想保留null
值,则必须为此添加特殊情况。
var n = (a === null) ? a : +a || 0;
请注意,null
与undefined
不同,因此您0
会获得undefined
。
如果您只想要解析的数字,或null
(即null
是任何未通过解析的值的默认值):
var n = +a || null;
答案 1 :(得分:2)
这可能不是您正在寻找的答案,但您应该在源头解决此问题,方法是确保obj.input1
中的值始终为number
。
obj.input1 = (typeof val === "string") ? parseFloat(val) : val;
注意:val
正在,无论您分配给obj.input1
。
答案 2 :(得分:0)
我认为你来自错误的假设,并试图让语言从那里开始工作。
没有&#34;铸造&#34;要自动完成,因为parseFloat()
只接受字符串,您必须更清楚如何转换值。您有一个number
类型的属性,在您的代码示例中可能有一个string
,在这种情况下,您希望执行不同的操作。所以它不仅仅是铸造。
将string
值设置为number
会产生错误,但我们暂时忽略它。
首先,如果您在同一属性上可能有不同的类型,则应使用联合类型:
class obj {
input1: number|string;
}
然后你的代码应该通过检查类型来解释它,就像David Sherret回答:
objToSendServer.input1 = typeof obj.input1 === 'string' ? parseFloat(obj.input1) : obj.input1;
TypeScript将正确解释条件检查条件,并为每种情况提供类型检查。
答案 3 :(得分:0)
Is there “automatic” type cast in typescript
No. There is type compatiblity and structural typing.
// if I try cast as below, error message is: //Argument of type 'number' is not assingable of parameter of type 'string'
The issue is that var St1 = document.getElementsByName("Start1")[0];
var Br1 = document.getElementsByName("Break1")[0];
var Wo1 = document.getElementsByName("Work1")[0];
var Le1 = document.getElementsByName("Leave1")[0];
function changeInput(e){
var calc = St1+Br1+Wo1
Le1.value = calc;
}
Wo1.onchange = changeInput;
accepts only a parseFloat
and you are passing it a string
. If number
is a number You do not need to do a obj.input1
on it.