已知有一个对象,key和value对应
{
a: { a1: 1 },
b: { b9: 1 },
c: { c5: 1 },
d: { d2: 1 },
...
}
怎么用ts来定义这样的数组?
[{
type: 'e',
value: { e1: 1 }
}, {
type: 'c',
value: { c5: 1 }
}]
已知有一个对象,key和value对应
{
a: { a1: 1 },
b: { b9: 1 },
c: { c5: 1 },
d: { d2: 1 },
...
}
怎么用ts来定义这样的数组?
[{
type: 'e',
value: { e1: 1 }
}, {
type: 'c',
value: { c5: 1 }
}]
type KeyValuePair = { [key: string]: number };
type ObjectType = {
type: string;
value: KeyValuePair;
};
type ObjectArray = ObjectType[];
// 使用
const objects: ObjectArray = [
{
type: 'e',
value: { e1: 1 }
},
{
type: 'c',
value: { c5: 1 }
}
];
一个并不完善的 type
:
type Obj = {
[props: string]: {
[props: string]: number;
};
};
type Pack<T extends Obj> = {
type: keyof T;
value: T[keyof T];
}[];
测试使用
const obj = {
a: { a1: 1 },
b: { b9: 1 },
c: { c5: 1 },
d: { d2: 1 },
};
const goodVal: Pack<typeof obj> = [
{
type: "a",
value: { a1: 10 },
},
{
type: "c",
value: { c5: 1 },
},
];
const badVal: Pack<typeof obj> = [
{
type: "e",
value: { e1: 1 },
},
{
type: "f",
value: { f6: 1 },
},
];
之所以说不完善,是因为没有限制 value
的 key
必须包含 type
前缀:
const val: Pack<typeof obj> = [
{
type: "a",
// 应该为 "a1"
value: { b9: 1 },
},
{
type: "d",
// 应该为 ”d2“
value: { a1: 1 },
},
];
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
6 回答2.4k 阅读
5 回答6.4k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
研究了一下,这个问题可以分为两个部分
利用 template type 很方便可以解决:
我能想到的是 record 转 union 转 array,其中
UnionToArray
参考了网上的文章。遗憾的是这两个思路不能共存于一个函数(在我看来),你可以按需求选择入参约束或返回类型。