繁体   English   中英

TypeScript:array.map强制返回类型?

[英]TypeScript: array.map force return type?

我有一个 function 可以输入一个数字或一个数字数组。 如果输入数字,则该 function 返回字符串,如果输入数字数组,则返回字符串数组。

这是我的问题
我使用array.map来获取结果数组。 array.map的隐式返回类型是 any。 这意味着 TypeScript 期望我的函数的返回类型是any ,否则它会抛出这个错误: 忽略此屏幕截图中我的箭头 function 中的typeof ,剩余代码

请注意,我在这里使用了一些递归。
我知道array.map function 只会返回一个字符串数组,所以我不希望我的函数的返回类型是any 我希望我的函数返回类型为string | string[] string | string[] 但是,由于 TypeScript 认为 array.map 可能会返回其他内容,因此它对我大喊大叫。

有没有办法强制array.map function 返回一个字符串数组? 或者让 TS 了解我在这里想要做什么?

// Function 将音符值与其数值交换以进行计算 function numToLet(input: number | number[], isSharp: boolean) {

//  Determine which reference key to use based on if we're viewing flats or sharps (isSharp)
let reference = [];
if (isSharp) {
    reference = ['G#', 'A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G'];
} else {
    reference = ['Ab', 'A', 'Bb', 'B', 'C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G'];
}


if (typeof input === 'number') {
    return reference[input];
}

if (typeof input === 'object') {
    return input.map(item => numToLet(item, isSharp));
    
}

}

问题实际上不是.map本身,而是递归。 正如错误消息所说,您应该添加一个返回类型,以便 TypeScript 可以理解返回类型可以是什么,给定递归。

为了让 TS 理解所有代码路径都返回一个值,如果输入不是数字,则无条件返回。

function numToLet(input: number | number[], isSharp: boolean): string | Array<string> {
    const reference = isSharp
        ? ['G#', 'A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G'];
        : ['Ab', 'A', 'Bb', 'B', 'C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G'];
    if (typeof input === 'number') {
        return reference[input];
    }
    return input.map(item => typeof numToLet(item, isSharp));
}

但这可能并不完全可取,因为它会导致

const result = numToLet(3, true);

被键入为字符串,而不是数字 - 您可能需要更精确的类型,这可以通过预先声明来完成:

function numToLet(input: number, isSharp: boolean): string;
function numToLet(input: number[], isSharp: boolean): string[];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM