打字稿。数组返回参数类型

时间:2018-02-19 19:07:41

标签: typescript return-type

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 个答案:

答案 0 :(得分:2)

您无法避免使用泛型,但您无需指定它们,因为它们可以自动推断。接受的答案可能足以满足您的需求,但还有另一种方式......

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

答案 1 :(得分:1)

不确定为什么你说'不求助于仿制药'。这正是打字稿中泛型的原因。使用泛型不是那么难:

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

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