类型'ISortPriority <any> []'的参数不能分配给类型的参数

时间:2019-04-16 15:40:05

标签: angular typescript

使用接口ISortPriority尝试分配键以匹配该接口,然后基于该接口对数组进行排序。我的排序算法有效,我在使用界面时遇到问题。

这是我正在运行的测试:

it('Should sort with multiple keys - Numbers', () => {
    const arr = [{name: 'j company', title: 'Software Eng 1', age: 23,company: 'test'}, {name: 'f company', age: 21, title: 'Software Eng 7', company: 'abc'},{name: 'g company', title: 'Software Eng 2', age: 22, company: 'test'}, {name: 't company', age: 24, title: 'Software Eng 3', company: 'test'}];
    const keys: ISortPriority<any>[] = [{sortKey: 'age', priority: 1}, {sortKey: 'company', priority: 3}, {sortKey: 'name', priority: 4}, {sortKey: 'title', priority: 5}];
    expect(sortArrayByKey(arr, keys)).toEqual([{name: 'f company', age: 21, title: 'Software Eng 7', company: 'abc'}, {name: 'g company', age: 22, title: 'Software Eng 2', company: 'test'}, {name: 'j company', age: 23, title: 'Software Eng 1', company: 'test'}, {name: 't company', age: 24, title: 'Software Eng 3', company: 'test'}]);
});

但是当我打电话:

expect(sortArrayByKey(arr, keys))

这是在说:“'ISortPriority []'类型的参数不能分配给''title'|“ name” |“ company” |“ age”'类型的参数。”悬停在“键”参数上方

最后,这是我正在使用的排序方法和接口:

export function sortArrayByKey<T>(ordersArr: T[], sortByKeys: keyof T): T[] {
    return ordersArr.sort((a, b) => {
    return sortWithKey(a, b, sortByKeys, 0);
});
}

function sortWithKey<T>(a: T, b: T, keys, index: number) {
    index = index || 0;
    keys = keys.sort((c, d) => (c.priority > d.priority) ? 1 : -1);
    const currKey = keys[index].sortKey;
    return a[currKey] > b[currKey] ? 1 : (a[currKey] < b[currKey] ? -1 : 
    sortWithKey(a, b, keys, index + 1));
}


export interface ISortPriority<T> {
    priority: number;
    sortKey: keyof T;
}

2 个答案:

答案 0 :(得分:0)

您的sortArrayByKey的第二个参数是

result = [str(b[int(i / len(c)) % len(b)]) + str(c[i % len(c)]) for i in range(len(a))]

这意味着它必须是您要在第一个参数中传递的对象的4个键之一,这些键是:标题,名称,公司和年龄。

我认为您输入的参数不正确,因为您要传递所有键及其优先级。因此,我认为sortArrayByKey的签名应如下所示:

sortByKeys: keyof T

答案 1 :(得分:0)

我看到的唯一问题是在下面键入参数sortByKeys

export function sortArrayByKey<T>(ordersArr: T[], sortByKeys: keyof T): T[] {
    return ordersArr.sort((a, b) => {
        return sortWithKey(a, b, sortByKeys, 0);
    });
}

在上面您说sortByKeys必须是T的key类型,但是然后在您的代码中尝试将其传递给ISortPriority []。

以下是我认为您应该进行的更改才能使此功能正常工作

export function sortArrayByKey<T>(ordersArr: T[], sortByKeys: ISortPriority<T>[]): T[] {
    return ordersArr.sort((a, b) => {
        return sortWithKey(a, b, sortByKeys, 0);
    });
}

function sortWithKey<T>(a: T, b: T, keys: ISortPriority<T>[], index: number) {
    index = index || 0;
    keys = keys.sort((c, d) => (c.priority > d.priority) ? 1 : -1);
    const currKey = keys[index].sortKey;
    return a[currKey] > b[currKey] ? 1 : (a[currKey] < b[currKey] ? -1 : 
    sortWithKey(a, b, keys, index + 1));
}

唯一的变化是,我在第一个函数中键入了sortByKeys参数,在第二个函数中键入了key参数,均为ISortPriority []。

我认为这可以解决问题。