如何输入强制转换,来自" string"最初编号为数字

时间:2015-05-12 19:22:06

标签: typescript

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> 以表达更明确的问题

4 个答案:

答案 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;

请注意,nullundefined不同,因此您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.