[英]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.