Typescript 如果参数为数组,则返回值数组,否则返回值

Typescript 如果参数为数组,则返回值数组,否则返回值,typescript,typescript-typings,Typescript,Typescript Typings,我想允许字符串或字符串的数组作为参数。根据传递的是字符串还是字符串数组,我想返回一个值或一个值数组 function(input: string | string[]): inputIsArray ? returnValue[] : returnValue {} 如何为此编写适当的类型?我想我会使用(但可以使用条件类型,请参见下文)。在本例中,我使用了number表示returnType,但这当然只是示例: function example(input: string): number; fu

我想允许
字符串
字符串
的数组作为参数。根据传递的是
字符串
还是
字符串
数组,我想返回一个值或一个值数组

function(input: string | string[]): inputIsArray ? returnValue[] : returnValue {}
如何为此编写适当的类型?

我想我会使用(但可以使用条件类型,请参见下文)。在本例中,我使用了
number
表示
returnType
,但这当然只是示例:

function example(input: string): number;
function example(input: string[]): number[];
function example(input: string | string[]): number | number[] {
    if (Array.isArray(input)) {
        return (<string[]>input).map(str => Number(str));
    }
    return Number(<string>input);
}

const result1 = example("42");         // `result1`'s type is `number`
const result2 = example(["42", "67"]); // `result2`'s type is `number[]`
()

请注意,引入
T
可以让我们在参数类型和返回值(条件)类型中使用它。(这是我在尝试将条件类型应用于此时错过的关键部分。)

他指出,条件类型版本开辟了第三种调用它的方式:使用类型为
string | string[]
的参数,而不是一个或另一个:

declare const value: string | string[];
let result3 = example(value) // `result3`'s type is `number | number[]`. Would not have worked with overloads.
()


所以,如果您想要第三个调用签名,您可以使用条件类型来获得它。否则,重载只提供前两个签名。

您没有看到编写类型的聪明方法吗,我假设是这样的:
函数myFunc(输入:S):S扩展字符串[]?编号[]:编号顺便说一句,再次收到你的评论真是太棒了,T.J.我相信我在10年前就已经收到了你的评论:)@Lukas-恐怕我不知道如何根据参数类型是否是数组来定义返回类型(除了使用重载:-)。@Lukas-我打了一个关于这件事的TypeScript专家。请参阅更新的答案。:-)谢谢你的努力,很高兴知道!它实际上也在我的代码中工作!
declare const value: string | string[];
let result3 = example(value) // `result3`'s type is `number | number[]`. Would not have worked with overloads.