代码之家  ›  专栏  ›  技术社区  ›  Freewind thk

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

  •  2
  • Freewind thk  · 技术社区  · 6 年前

    已经有一个常量,它是一个数组:

    const fieldTypes = [
        { id: 1, name: 'text'},
        { id: 2, name: 'list'},
        // ...
        { id: 10, name: 'switch'}
    ]
    

    我想定义一个基于常量的新类型 fieldTypes

    type IdToNamesType = ???
    

    真正的定义 IdToNamesType 应类似于:

    type IdToNamesType = {
       1: 'text',
       2: 'list',
       // ...
       10: 'switch'
    }
    

    有可能吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    6 年前

    要解决的第一个问题是确保 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']
    }
    
    推荐文章