使用ramda groupby克服typescript类型错误

时间:2017-12-07 16:48:51

标签: typescript

我不知道如何修复此打字稿错误。我试图使用ramda的groupBy函数:

245: const groups = R.groupBy((row: Record) => {
246:            return row[this.props.groupBy]
247:        })(this.props.data)

this.props.groupBy定义为:

groupBy?: {[K in keyof Record]}
data: Array<Record>

我得到的错误是:

Error:(245, 38) TS2345:Argument of type '(row: Record) => <T>(obj: any) => T' is not assignable to parameter of type '(a: Record) => string'.
  Type '<T>(obj: any) => T' is not assignable to type 'string'.

Error:(246, 31) TS2683:'this' implicitly has type 'any' because it does not have a type annotation.

编辑:我决定不使用keyof类型,只是将它声明为groupBy作为字符串。我不认为这些是我真正的错误,但是intellij在更新错误消息方面遇到了麻烦,所以谁知道呢。他们现在已经离开了。

2 个答案:

答案 0 :(得分:1)

您的问题有几个问题,修复使代码易于使用:

namespace X {

    class Record {
        Test: string;
        Bla: string;
        test: number;
    }

    class TT {
        props: {
            groupBy?: keyof Record,
            data: Array<Record>
        }
        name() {
            const groups = R.groupBy((row: Record) => {
                return row[this.props.groupBy].toString();
            })(this.props.data)
        }
    }
}

问题是:

  1. groupBy应该是keyof Record而不是{[K in keyof Record]}。第一个定义了一个类型,可以采用Record属性的任何名称。您的版本定义了一种类型,其结构与Record相同,但所有属性都为any。

  2. groupBy特别希望返回类型为字符串,而row上的索引操作可以返回记录的任何类型的属性(示例中为ex string|number上面)您应该.toString将所有内容转换为字符串

  3. 注意:我使用标准编译器设置,您可能会在strict时遇到其他错误,但由于不提及我认为标准的选项。我测试了TS 2.6.2,以及来自npm的Ramda的最新版本,其他版本的错误可能不同。

答案 1 :(得分:0)

  

使用ramda groupby

克服打字稿类型错误

您可以使用类型断言any

245: const groups = (R as any).groupBy((row: Record) => {
246:            return row[this.props.groupBy]
247:        })(this.props.data)

更多