gpt4 book ai didi

typescript - 如果参数是数组返回值数组否则返回值

转载 作者:行者123 更新时间:2023-12-04 01:42:38 24 4
gpt4 key购买 nike

我想允许一个 stringstring 的数组s 作为参数。取决于是否stringstring 的数组s 已通过我想返回一个值或一个值数组。

function(input: string | string[]): inputIsArray ? returnValue[] : returnValue {}

我该如何为此编写正确的类型?

最佳答案

我想我会用 overloads (但可以使用条件类型,见下文)。在这个例子中,我使用了 numberreturnType但当然这只是为了举例:

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[]`

( on the playground )

请注意,其中的第三个只是实现签名。 example 唯一有效的调用签名有前两个。

在您的评论中询问条件类型是否可行,我在场外 ping Titian Cernicova-Dragomir ,SO 的 TypeScript 专家之一。他说他已经看到了这个问题,并且当他看到我有 :-) 时他将发布重载答案,并且他也会为此使用重载 - 但如果你想这样做,条件类型是可能的方式,这样做会打开第三个调用签名。这是他想出的:
function example<T extends string | string[]>(input: T): T extends string ? number : 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[]`

( on the playground )

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

他指出,条件类型版本开辟了第三种调用方式:使用类型为 string | string[] 的参数。 ,而不是其中之一:
declare const value: string | string[];
let result3 = example(value) // `result3`'s type is `number | number[]`. Would not have worked with overloads.

( on the playground )

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

关于typescript - 如果参数是数组返回值数组否则返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56735618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com