【发布时间】:2020-06-15 04:30:15
【问题描述】:
我想声明一个类型强制的项目数组,并能够从中派生一个联合类型。如果您没有明确地为数组中的项目指定类型,则此模式有效。我不知道如何最好地解释它,所以这里是一个例子:
示例 1
type Pair = {
key: string;
value: number;
};
const pairs: ReadonlyArray<Pair> = [
{ key: 'foo', value: 1 },
{ key: 'bar', value: 2 },
] as const;
type Keys = typeof pairs[number]['key']
示例 2
type Data = {
name: string;
age: number;
};
const DataRecord: Record<string, Data> = {
foo: { name: 'Mark', age: 35 },
bar: { name: 'Jeff', age: 56 },
} as const;
type Keys = keyof typeof DataRecord;
这是使用as const 时派生密钥的示例。我想要同样的行为,但数组是显式类型的。
const pairs = [
{ key: 'foo', value: 1 },
{ key: 'bar', value: 2 },
] as const;
type Keys = typeof pairs[number]['key']; // "foo" | "bar"
想要的键值:"foo"|"bar"
键的实际值:string
【问题讨论】:
-
我不认为您可以按照您尝试的方式动态地执行此操作,您将运行时值与编译时类型混为一谈。您必须为
Pair类型的key属性提供您想要的类型,然后它应该像您编写的那样工作。 -
@JaredSmith 这在运行时应该不是问题。我用它来声明任意数量的在执行期间不会改变的值。这相当于在类型声明中设置 key: "foo"|"bar"。
-
"这在运行时应该不是问题" --- typescript 没有运行时,所以在运行时是一个问题。
-
@Ben 请允许我说得更具体一点:我认为您不能像使用不可变原语元组那样使用从可变引用类型中提取的属性元组来做到这一点。你可以说
possibleKeys = ['foo', 'bar'] as const; type Keys = typeof possibleKeys[number]; type Pair = { key: Keys, value: number };,但你仍然需要明确列举可能的键。
标签: javascript typescript constants typeof keyof