打字稿类型“数字”不可分配│键入“字符串”
Posted
技术标签:
【中文标题】打字稿类型“数字”不可分配│键入“字符串”【英文标题】:Typescript Type 'number' is not assignable │ to type 'string' 【发布时间】:2018-07-18 02:46:14 【问题描述】:我目前正在为 Angular 4 应用程序制作货币格式化程序指令。在解析时去掉除数字和小数之外的所有内容,最后得到一个字符串化的浮点数,但我需要它作为浮点数返回,这样我就可以用它做数学运算了。
parse(value: string, fractionSize: number = 2): number
let val = value.replace(/([^0-9.])+/ig, '');
let [ integer, fraction = "" ] = (val || "").split(this.DECIMAL_SEPARATOR);
integer = integer.replace(new RegExp(this.THOUSANDS_SEPARATOR, "g"), "");
fraction = parseInt(fraction, 10) > 0 && fractionSize > 0
? this.DECIMAL_SEPARATOR + (fraction + PADDING).substring(0, fractionSize)
: "";
let result = `$integer$fraction`;
// at this point result = "100.55";
result = parseFloat(result); // this refuses to compile saying "Type 'number' is not assignable │ to type 'string'"
return result;
【问题讨论】:
【参考方案1】:您不能为 Typescript 中的变量分配不同的类型。如果您使用 string
初始化变量,则它必须保持为 string
。
let result = `$integer$fraction`;
let resultAsNumber = parseFloat(result);
return resultAsNumber
这是错误的常见原因,类型系统会试图阻止您这样做。
【讨论】:
【参考方案2】:有一个明显的错误,你试图给一个字符串变量赋值,不用再解析成Float,解析返回数字就行了
let result = `$integer$fraction`;
// at this point result = "100.55";
return parseFloat(result);
【讨论】:
【参考方案3】:两行:
let result = `$integer$fraction`;
result = parseFloat(result);
是问题所在。 Typescript 非常适合在未显式声明时推断变量的类型。在这种情况下,因为您将字符串分配给result
,所以打字稿将其类型推断为字符串。要解决此问题,您有两个选择。首先,显式声明该变量的类型,以便它允许字符串和数字:
let result: string|number = `$integer$fraction`;
result = parseFloat(result); // now should be ok.
或者您可以将解析后的数字分配给一个新变量,而不是重复使用result
变量:
let result = `$integer$fraction`;
let numberResult = parseFloat(result); // now should be ok.
【讨论】:
以上是关于打字稿类型“数字”不可分配│键入“字符串”的主要内容,如果未能解决你的问题,请参考以下文章
打字稿类型'字符串| null' 不可分配给类型 'string'
打字稿:如何键入 Ramda R.prop(key) T' 不可分配给类型为 '(s: ) => 的参数
打字稿:'字符串| undefined' 不可分配给类型 'string'
打字稿:“RegExpMatchArray”类型的参数不可分配给“字符串”类型的参数