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的好答案我应该说“在调用函数时不使用泛型”
答案 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];
}
考虑这个答案是对可以做什么的心理练习 - 我仍然在搞乱新玩具。 :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
没有泛型,就没有办法实现这一点。