Typescript可以使用使用元素类型参数的方法扩展Array.prototype吗?

贾拉德

这是一个很长的标题,用于描述非常简单的内容。

interface Array<T> {
  sortBy<T, K>(keyFunction: (t: T) => K): T[];
}

export namespace util {
export function sortBy<Element, Key>(array: Element[], keyFunction: (t: Element) => Key ): Element[] {

    var arrayCopy = array.slice();

    var mapped = arrayCopy.map(function(el, i) {
      return { index: i, value: keyFunction(el) };
    });

    mapped.sort(function(a, b) {
      return +(a.value > b.value) || +(a.value === b.value) - 1;
    });

    for (let i = 0; i < array.length; i++) {
        let indexed = mapped[i];
        array[i] = arrayCopy[indexed.index];
    }

    var result = mapped.map(function(el){
      return arrayCopy[el.index];
    });

    return array;

}
}

Array.prototype.sortBy = function(keyFunction)  {return util.sortBy(this, keyFunction)}

在这里,我正在实现MDN的一些示例代码,以数组键而不是比较函数的形式进行排序,并尝试用它修补Array原型(有关是否是个好主意的评论)。

但是,当我调用它时,Typescript无法验证键函数的正确参数类型,因此需要进行强制转换以防止编译器错误:

it('should sort in-place', () => {
    var list = [{a: 'z', i: 2}, {a: 'x', i: 0}, {a: 'y', i:1}];
    // all good
    list.sortBy(<Function>(obj) => obj.i);
    expect(list.map((obj) => obj.a)
               .join('')
    ).toBe('xyz');
})


it('should sort in-place', () => {
    var list = [{a: 'z', i: 2}, {a: 'x', i: 0}, {a: 'y', i:1}];
    // Error TS2339: Property 'i' does not exist on type '{}'
    list.sortBy((obj) => obj.i);
    expect(list.map((obj) => obj.a)
               .join('')
    ).toBe('xyz');
})

有什么办法可以更改此定义以起作用?有趣的是,调用util.sortBy(array, function)(即作为函数而非方法)具有正确运行的类型参数。

巴萨拉特

您接口声明的排序功能,创建一个新的TsortBy<T, K>)从断开ArrayT应该是sortBy<K>和重用ArrayT

正确声明

interface Array<T> {
  sortBy<K>(keyFunction: (t: T) => K): T[];
}

var list = [{a: 'z', i: 2}, {a: 'x', i: 0}, {a: 'y', i:1}];

// Okay
list.sortBy((obj) => obj.i);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TypeScript中可以使用通用类型别名吗?

来自分类Dev

我可以使用强类型反射找到具有通用参数的方法吗?

来自分类Dev

我可以使用成员元素作为类方法的默认参数吗?

来自分类Dev

JavaScript:可以使用“ Object.prototype.toString.call(obj)”进行数据类型检测吗?

来自分类Dev

JavaScript:可以使用“ Object.prototype.toString.call(obj)”进行数据类型检测吗?

来自分类Dev

Swift类可以使用相同的方法扩展多次吗?

来自分类Dev

扩展方法可以使用非静态字段吗?

来自分类Dev

set方法可以使用其他类型的值吗?

来自分类Dev

Coq:我可以使用类型参数作为连续参数的类型吗?

来自分类Dev

使用Prototype将窗口滚动到y轴中心吗?

来自分类Dev

可以使用[in]参数返回数据吗?

来自分类Dev

jekyll可以使用GET参数吗?

来自分类Dev

jekyll可以使用GET参数吗?

来自分类Dev

当相同类型的元素已经存在时,可以使用selectAll创建新元素吗?

来自分类Dev

您可以使用shell参数扩展来匹配数字吗?

来自分类Dev

我可以使用浏览器扩展来操纵URL参数吗?

来自分类Dev

在空数组上调用Array.prototype.reverse()吗?

来自分类Dev

JS Array.prototype.map()碰巧是可变的吗?

来自分类Dev

Array.prototype.map不能用于Promise吗?

来自分类Dev

MyPy类型提示使用命名参数定义的函数,但可以使用** kwargs吗?

来自分类Dev

我可以使用DataKinds编写一个返回参数编码类型的值的函数吗?

来自分类Dev

打字稿:可以使用自己的键对类型进行参数化吗?

来自分类Dev

我可以使用伪元素作为 scss mixin 的参数吗?

来自分类Dev

这个功能可以用 Array.prototype 方法完成吗

来自分类Dev

TypeScript泛型:可以使用圆形或自绑定类型变量吗?

来自分类Dev

Typescript:使用特定的扩展接口来满足通用的“ extends”类型参数吗?

来自分类Dev

可以使用通用Java方法的通用类型来强制实参的类型吗?

来自分类Dev

在扩展类上,我可以使用实现多个接口的类的getter和setter方法吗

来自分类Dev

有什么方法可以使用chrome扩展程序来检测javascript后消息吗?

Related 相关文章

  1. 1

    TypeScript中可以使用通用类型别名吗?

  2. 2

    我可以使用强类型反射找到具有通用参数的方法吗?

  3. 3

    我可以使用成员元素作为类方法的默认参数吗?

  4. 4

    JavaScript:可以使用“ Object.prototype.toString.call(obj)”进行数据类型检测吗?

  5. 5

    JavaScript:可以使用“ Object.prototype.toString.call(obj)”进行数据类型检测吗?

  6. 6

    Swift类可以使用相同的方法扩展多次吗?

  7. 7

    扩展方法可以使用非静态字段吗?

  8. 8

    set方法可以使用其他类型的值吗?

  9. 9

    Coq:我可以使用类型参数作为连续参数的类型吗?

  10. 10

    使用Prototype将窗口滚动到y轴中心吗?

  11. 11

    可以使用[in]参数返回数据吗?

  12. 12

    jekyll可以使用GET参数吗?

  13. 13

    jekyll可以使用GET参数吗?

  14. 14

    当相同类型的元素已经存在时,可以使用selectAll创建新元素吗?

  15. 15

    您可以使用shell参数扩展来匹配数字吗?

  16. 16

    我可以使用浏览器扩展来操纵URL参数吗?

  17. 17

    在空数组上调用Array.prototype.reverse()吗?

  18. 18

    JS Array.prototype.map()碰巧是可变的吗?

  19. 19

    Array.prototype.map不能用于Promise吗?

  20. 20

    MyPy类型提示使用命名参数定义的函数,但可以使用** kwargs吗?

  21. 21

    我可以使用DataKinds编写一个返回参数编码类型的值的函数吗?

  22. 22

    打字稿:可以使用自己的键对类型进行参数化吗?

  23. 23

    我可以使用伪元素作为 scss mixin 的参数吗?

  24. 24

    这个功能可以用 Array.prototype 方法完成吗

  25. 25

    TypeScript泛型:可以使用圆形或自绑定类型变量吗?

  26. 26

    Typescript:使用特定的扩展接口来满足通用的“ extends”类型参数吗?

  27. 27

    可以使用通用Java方法的通用类型来强制实参的类型吗?

  28. 28

    在扩展类上,我可以使用实现多个接口的类的getter和setter方法吗

  29. 29

    有什么方法可以使用chrome扩展程序来检测javascript后消息吗?

热门标签

归档