【发布时间】:2020-07-20 09:49:11
【问题描述】:
我正在研究一个有 1 个参数的函数。参数要么是一个对象(可以嵌套),要么是一个对象数组。输入可能类似于
{
key1: {
key2: [{
key3: 1,
key4: {
key5: [...]
}
}]
}
}
或
[
{ key1: 1, key2: 2, key3: { key4: 'val' }},
{ key5: { key6: { key7: 'val' }}}
]
输入的任何部分都可以是对象或数组。
为简单起见,此函数获取对象的所有键,并将New 附加到它们。
例如,带输入
{
name: 'Name',
email: 'name@example.com'
}
输出将是
{
nameNew: 'Name',
emailNew: 'name@example.com'
}
如果参数是一个数组,函数会映射数组并做同样的事情。
我遇到的问题是因为我不知道对象的嵌套级别,所以使用了递归函数。这是我到目前为止所拥有的。链接到playground
interface Object {
[key: string]: Object | Object[];
}
function mapper(arg: Object[]): Object[];
function mapper(arg: Object): Object {
if (Array.isArray(arg)) {
return arg.map(mapper);
}
let result: Object = {};
Object.keys(arg).forEach((key) => {
let newKey: string = key + "New";
let value = arg[key];
if (value instanceof Array) {
result[newKey] = value.map(mapper);
} else if (Object.prototype.toString.call(arg) === "[object Object]") {
result[newKey] = mapper(value);
} else {
result[newKey] = value;
}
});
return result;
}
问题在于这段代码
if (Array.isArray(arg)) {
return arg.map(mapper);
}
我对数组进行类型检查,所以如果输入是Object[],我只会进入块。当我映射输入并在每个元素上调用 mapper 时,Typescript 正在使用签名
function mapper(arg: Object[]): Object[]
当每个元素都是Object 时。我得到这个错误
Type 'Object[][]' is not assignable to type 'Object'.
Index signature is missing in type 'Object[][]'.
有几个打字问题,但这是我无法解决的主要问题。
我认为 Typescript 可以正确推断打字,因为在 map 函数中使用 Object 调用 mapper。
【问题讨论】:
标签: typescript recursion typescript-typings