定义和使用固定数组类型

时间:2019-07-23 22:58:20

标签: typescript

我有以下地图:

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个成员)。我还能做些什么来解决这个问题?

2 个答案:

答案 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)

Playground link

答案 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