打字稿类型“数字”不可分配│键入“字符串”

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”类型的参数不可分配给“字符串”类型的参数

打字稿:键入'字符串| undefined' 不能分配给 type 'string'

打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数