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

标签 typescript typescript-typings

我想允许一个 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/

相关文章:

angular - 使用 Angular rxjs 中的另一个可观察值转换来自一个可观察值的数据

angular - 为什么 TypeScript 接受值作为数据类型?

Typescript - 迭代以解析/细化对象

typescript - 在对 LitElement 组件进行单元测试时如何正确 stub 元素?

angular - ERROR in AppComponent 不能作为入口组件

typescript - 类型 '{ useNewUrlParser: boolean; useUnifiedTopology: boolean}' 的参数不可分配给类型的参数'

typescript - 使用 TypeScript 和 Emotion 设计 Reach UI

javascript - typescript 对象在参数中休息打字

typescript - 元素隐式具有 'any' 类型,因为类型 '{}' 没有索引签名。 [7017]

Angular 4 无法绑定(bind)到 <property> 因为它不是 <component> 的已知属性