已经有一个const,它是一个数组:
const fieldTypes = [
{ id: 1, name: 'text'},
{ id: 2, name: 'list'},
// ...
{ id: 10, name: 'switch'}
]
我想基于const fieldTypes
type IdToNamesType = ???
IdToNamesType
的真实定义应类似于:
type IdToNamesType = {
1: 'text',
2: 'list',
// ...
10: 'switch'
}
有可能做到吗?
答案 0 :(得分:2)
要解决的第一个问题是确保将id
和name
推断为数字和字符串文字类型,而不是number
和string
。为此,我们可以使用以下功能:
function fields<TId extends number, TName extends string, T extends { id: TId, name: TName }[]>(...o:T):T {
return o;
}
const fieldTypes = fields(
{ id: 1, name: 'text'},
{ id: 2, name: 'list'},
{ id: 10, name: 'switch'}
);
/*
typeof fieldTypes = [{
id: 1;
name: "text";
}, {
id: 2;
name: "list";
}, {
id: 10;
name: "switch";
}]
*/
现在我们可以使用映射类型将元组类型转换为对象类型:
type IdToNamesType = {
[P in typeof fieldTypes[number]['id']] : Extract<typeof fieldTypes[number], { id: P }>['name']
}