Infer tuple type instead of union type

前端 未结 2 425
梦谈多话
梦谈多话 2020-12-21 12:53

Does anybody know how to make compiler to infer tuple type automatically ?

// Now: (string | number)[]
// Wanted: [string, number][]
const x = [ [\"a\", 2],          


        
相关标签:
2条回答
  • 2020-12-21 13:21

    The compiler does not infer that, and there no way to force it to "know" it. the only thing that you can (And should do) is defined an interface that extends Array. like this:

    interface NumStrTuple extends Array<string | number> {
        0: number;
        1: string;
        length: 2;
    }
    

    And use it to define your const like this:

    const x: NumStrTuple = [ ["a", 2], ["b", 2] ];
    
    0 讨论(0)
  • 2020-12-21 13:30

    This can be done if we use an extra function to help type inference a bit:

    function tupleArray<T1, T2, T3>(arr:[T1, T2, T3][]) : typeof arr 
    function tupleArray<T1, T2>(arr:[T1, T2][]) : typeof arr 
    function tupleArray<T1>(arr:[T1][]) : typeof arr 
    function tupleArray(arr:any[]) : any[]{
        return arr;
    }
    
    var t = tupleArray([ ["a", 2], ["b", 2] ]) // [string, number][]
    

    Edit

    Better version with fewer overrides:

    const tupleArray = <T extends ([any] | any[])[]>(args: T): T => args
    tupleArray([["A", 1], ["B", 2]]) // [string, number][]
    

    You can add more overloads if you need more then 3 items in the tuple.

    0 讨论(0)
提交回复
热议问题