【发布时间】:2021-09-29 21:12:19
【问题描述】:
我尝试定义一种可以分配对象中任何键的类型。然后,我发现this 是一个很好的答案。
type AnyMap = Record<string, any>;
const obj: AnyMap = {};
const obj1: AnyMap = {
a: 'a',
b: 'b'
}
但是,我发现AnyMap 也可以分配给一个数组并且它没有显示任何错误。
const arr1: AnyMap = ['a', 'b'];
我只想AnyMap 只定义object的类型,不包括array。所以,我尝试创建另一种类型。
type UnknownMap = Record<string, unknown>;
// obj2 is works fine
const obj2: UnknownMap = {
a: 'a',
b: 'b'
}
// obj3 is works fine
const obj3: UnknownMap = {
0: 'a',
1: 'b'
}
// arr2 throws an error
// Type 'string[]' is not assignable to type 'UnknownMap'. Index signature is missing in type 'string[]'.(2322)
const arr2: UnknownMap = ['a', 'b'];
UnknownMap 的结果对我来说似乎不错。它只定义了 object 的类型,并抛出 array 的错误。最后,我有两个问题我不太明白。
-
如果我只想定义object的类型,不想包含array的类型。使用
UnknownMap而不是AnyMap更好吗? -
为什么
const arr2: UnknownMap = ['a', 'b']会抛出错误Type 'string[]' is not assignable to type 'UnknownMap'. Index signature is missing in type 'string[]'.(2322)?我不知道为什么仅仅因为我在Record中将any替换为unknown就会引发错误。另外,我不知道为什么obj3可以正常工作,但arr2会抛出错误。
我希望上面的链接可以帮助很好地解释我的问题。如果有任何描述让您感到困惑,请告诉我,谢谢。
【问题讨论】:
-
但是数组是对象吗?
-
(2) 确实很奇怪。
-
我也不太确定,我对答案很感兴趣。我认为这与类型推断有关。因为这有效
const arr2: UnknownMap = (['a', 'b'] as unknown) as UnknownMap;抱歉似乎无法插入链接 -
FWIW 这似乎是特定于
Array,一种与Array具有相同行为的自写类型在这种情况下的行为不同。 demo
标签: typescript