繁体   English   中英

打字稿将普通字符串转换为 Map

[英]Typescript convert plain string to Map

我有这个字符串(称为统计信息):

active_total: 1087
cumulative: 1
trace_total: 10

这甚至不是 JSON 格式。

是我正在尝试的解决方案:

let keyValuePairs = stats
  .split(/\s*\n\s*/)                     //split with optional spaces around the comma
  .map(chunk => chunk.split(": "));      //split key=value
  
const map = new Map(keyValuePairs);

console.log(map.get("sessions_active_total"));
console.log(map.get("cumulative"));

但它在这一行抛出编译错误:

const map = new Map(keyValuePairs);

错误信息:

error TS2769: No overload matches this call.
  Overload 1 of 3, '(iterable: Iterable<readonly [unknown, unknown]>): Map<unknown, unknown>', gave the following error.
    Argument of type 'string[][]' is not assignable to parameter of type 'Iterable<readonly [unknown, unknown]>'.
      The types returned by '[Symbol.iterator]().next(...)' are incompatible between these types.
        Type 'IteratorResult<string[], any>' is not assignable to type 'IteratorResult<readonly [unknown, unknown], any>'.
          Type 'IteratorYieldResult<string[]>' is not assignable to type 'IteratorResult<readonly [unknown, unknown], any>'.
            Type 'IteratorYieldResult<string[]>' is not assignable to type 'IteratorYieldResult<readonly [unknown, unknown]>'.
              Type 'string[]' is not assignable to type 'readonly [unknown, unknown]'.
                Target requires 2 element(s) but source may have fewer.
  Overload 2 of 3, '(entries?: readonly (readonly [unknown, unknown])[]): Map<unknown, unknown>', gave the following error.
    Argument of type 'string[][]' is not assignable to parameter of type 'readonly (readonly [unknown, unknown])[]'.
      Type 'string[]' is not assignable to type 'readonly [unknown, unknown]'.

58         const map = new Map(keyValuePairs);

Typescript 无法推断出chunk.split(": ")的确切结果。 即使能够远程猜测它,打字稿也应该知道stats变量的运行时值。

如果您正在寻找类型安全的解决方案,我假设使用自定义类型谓词

const isTupleOf2 = (chunk: string[]): chunk is [string, string] => chunk.length === 2

let keyValuePairs = stats
  .split(/\s*\n\s*/)
  .map((chunk: string) => chunk.split(": "))
  .filter(isTupleOf2)      
  
const map = new Map(keyValuePairs);

游乐场链接

或者,如果您绝对确定结果将始终是您期望的结果,则可以使用类型断言

let keyValuePairs = stats
  .split(/\s*\n\s*/)
  .map((chunk: string) => chunk.split(": ") as [string, string])

const map = new Map(keyValuePairs);

游乐场链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM