[英]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.