javascript - 打字稿:从对象数组派生联合类型
问题描述
我想声明一个类型强制的项目数组,并能够从中派生一个联合类型。如果您没有明确地为数组中的项目指定类型,则此模式有效。我不确定如何最好地解释它,所以这里是一个例子:
例 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
解决方案
对于变量,您可以让编译器从初始化中推断类型,也可以显式写出。如果您像以前一样显式编写它,则将根据注释检查初始化值,但初始化器的实际类型不会影响变量的类型(因此您会丢失所需的类型信息)。如果您让编译器推断它,则不再可能约束类型以符合特定接口(如您所愿)
解决方案是使用通用函数来约束值并推断它的实际类型:
type Pair = {
key: string;
value: number;
};
function createPairsArray<T extends readonly Pair[] & Array<{key: V}>, V extends string>(...args: T) {
return args
}
const pairs = createPairsArray(
{ key: 'foo', value: 1 },
{ key: 'bar', value: 2 },
)
type Keys1 = typeof pairs[number]['key']
type Data = {
name: string;
age: number;
};
function createDataObject<T extends Record<string, Data>>(arg: T) {
return arg;
}
const DataRecord = createDataObject({
foo: { name: 'Mark', age: 35 },
bar: { name: 'Jeff', age: 56 },
})
type Keys2 = keyof typeof DataRecord;
注意:对于数组的情况,我们需要稍微加强编译器来推断 的字符串字面量类型key
,因此整个& Array<{key: V}>
,V
类型参数在哪里扩展string
推荐阅读
- php - Laravel 多对多返回空集合
- c# - C# 正则表达式在字符串多次出现之间提取值
- tensorflow - Keras 预测导致 CUDA_ERROR_OUT_OF_MEMORY
- vhdl - 在 Pre-Synthesis / Post-Synthesis 中使用 ModelSim 模拟 VHDL 设计时有条件地使用库
- php - Auth::attempt($credentials) 总是返回 false
- python - 错误 1452 (23000):无法添加或更新子行:外键约束失败我无法修复
- c++ - 从 RGBA 到 HLS 的 cvtColor 不会修改任何内容
- spring-boot - 让 Docker 容器网络在 Heroku 上运行
- android - 如何在后台有一个可以从蓝牙连接读取和写入数据的任务?
- c - 在 if 语句中使用位移变量 - 错误与否