我有以下地图:
var myMap = new Map<string, [string, number]>()
此映射的值将始终为2项数组,第一项为字符串,第二项为数字
myMap.set("foo", ["bar", 42])
这按预期工作。此外,具有额外成员的数组也无法正常工作
myMap.set("foo", ["bar", 42, 0]) // too many arguments
我遇到的问题是在set()
之外定义它:
var value = ["bar", 42]
myMap.set("foo", value)
这会导致以下错误:
Argument of type '(string | number)[]' is not assignable to parameter of type '[string, number]'.
Type '(string | number)[]' is missing the following properties from type '[string, number]': 0, 1
我可以通过强制输入以下类型来解决此问题:
var value = <[string, number]>["bar", 42]
但是我讨厌这样做,因为它看起来太冗长了(我很可能将数组定义为10或15个成员)。我还能做些什么来解决这个问题?
答案 0 :(得分:1)
借助一些小帮手,我们可以为地图的值类型定义类型别名,该别名可以替代使用:
type MapValue<M extends Map<any, any>> = M extends Map<any, infer V> ? V : never;
var myMap = new Map<string, [string, number]>()
var value: MapValue<typeof myMap> = ["bar", 42] // value: [string, number]
myMap.set("foo", value)
答案 1 :(得分:1)
如果您是静态定义这些元组(例如,通过在源代码中手工编写它们),并且能够将值定义为readonly
,则可以使用as const
类型断言来确保TypeScript推断出元组类型而不是数组类型:
var myMap = new Map<string, readonly [string, number]>()
const value = ['hello', 123] as const;
myMap.set("foo", value); // Works as expected