代码之家  ›  专栏  ›  技术社区  ›  tru7

类型脚本。返回参数类型的数组

  •  0
  • tru7  · 技术社区  · 6 年前
    function last(anArray:any[]) /*:????*/ {
        return anArray[anArray.length-1];
    }
    

    在不使用泛型的情况下,是否可以将上述函数中的返回类型指定为参数的元素类型,以便

    let strs:string[]=["aaa","bbb","ccc"];
    let lastStr=last(strs);     // type of lastStr should be string
    
    let dates:Date[]=[new Date];
    let lastDate=last(dates);      // type of lastDate should be Date
    

    编辑 :看到@Titian Cernicova Dragomir给出的好答案,我应该说“调用函数时不使用泛型”

    2 回复  |  直到 6 年前
        1
  •  2
  •   Meirion Hughes    6 年前

    您无法避免泛型,但不必指定它们,因为它们可以自动推断。公认的答案可能足以满足您的需要,但还有另一种方法。。。

    Typescript 2.8将引入类型推断(目前发布为夜间构建)。通过将条件类型与类型推断相结合,您可以支持任意类型的元组(固定大小N),而不是所有元素都是相同的类型。

    type tuple =
      [any] |
      [any, any] |
      [any, any, any] |
      [any, any, any, any];
    
    type TupleLast<T extends tuple> =
      T extends [infer L] ? L :
      T extends [any, infer L] ? L : 
      T extends [any, any, infer L] ? L : 
      T extends [any, any, any, infer L] ? L : any;
    
    function last<T extends tuple>(arg: T): TupleLast<T> {
      return arg[arg.length - 1];
    }
    

    enter image description here

    enter image description here

    把这个答案看作是一个可以做什么的脑力练习——我还在摆弄新玩具D

        2
  •  1
  •   Titian Cernicova-Dragomir    6 年前

    不知道你为什么说“不使用泛型”。这正是typescript中使用泛型的原因。使用泛型并不难:

    function last<T>(anArray:T[]) :T {
        return anArray[anArray.length-1];
    }
    // usage
    
    let strs:string[]=["aaa","bbb","ccc"];
    let lastStr=last(strs);     // string
    
    let dates:Date[]=[new Date()];
    let lastDate=last(dates); //date
    

    没有泛型就无法实现这一点。