typescript - 如何根据数组项的某些键定义新类型?

标签 typescript types

已经有一个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'
}

可以吗?

最佳答案

要解决的第一个问题是确保 idname 被推断为数字和字符串文字类型,而不是 number字符串。为此,我们可以使用这个函数:

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']
}

关于typescript - 如何根据数组项的某些键定义新类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53394285/

相关文章:

javascript - 强类型对象中的 TypeScript 循环约束

Angular2 事件发射器未得到处理

c# - 约束 System.Type 作为类型安全的通用参数

javascript - Angular2从query.selectareas.js导入自调用的jQuery库给出运行时错误: jQuery is not defined

javascript - 将字符串转换为日期而不考虑时区 - Typescript

typescript - 如何判断 Typescript 中是否存在函数

sql - 在 SQL Server 中存储 IP 地址最合适的数据类型是什么?

haskell - 多态函数作为 Haskell 中的参数

generics - 类型推断: Using generic methods with implicit type conversion

generics - 如何将 "Encodable"绑定(bind)到类型参数?