我如何推断没有类型变量的返回类型?

时间:2019-11-19 15:38:01

标签: typescript

我的目标是创建一个函数,该函数克隆一个数组-并保留类型。使用此代码,打字稿将返回类型声明为任意:

export function someFn(inputArray) {
    return [...inputArray];
}
// result will have any[] as type
const result = someFn([1, 2, 3]);

如何告诉打字稿,someFn的返回类型将与输入相同(即,在这种情况下为数字数组)?

解决方法

我知道我可以使用类型变量来做到这一点:

export function someFn<T>(inputArray): T[] {
    return [...inputArray];
}
// result will have number[] as type (but only because I input T as number)
const result = someFn<number>([1, 2, 3]);

我想避免上述解决方法,因为它迫使我事先声明类型。

2 个答案:

答案 0 :(得分:3)

如果您将自变量键入取决于T的任何内容(在下面的示例T[]中),则将从该自变量推断出泛型,而无需在调用时指定它:

function someFn<T>(inputArray: T[]): T[] {
  return [...inputArray];
}

const result = someFn([1, 2, 3]); // `result` will be of type `number[]`

答案 1 :(得分:2)

即使您说不想使用泛型类型,这也是正确的答案。但是,您的声明并未充分利用它:

export function someFn<T>(inputArray: T[]): T[] {
    return [...inputArray];
}

const numberResult: number[] = someFn([1, 2, 3]);       //correct
const stringResult: string[] = someFn(["a", "b", "c"]); //correct
const mixedResult: string[] = someFn(["a", 2]);         //error

TypeScript Playground

如果您声明输出将是与输入相同类型的数组,则无需显式指定泛型类型参数。