immutables打字稿类型定义:为什么concat操作在任何?

时间:2017-03-12 07:18:41

标签: javascript typescript immutable.js

我不明白为什么Collection<K, V>中的the definition of concat使用了any

concat(...valuesOrCollections: Array<any>): Collection<any, any>;

为什么不能:

concat(...valuesOrCollections: Array<V>): Collection<K, V>;

2 个答案:

答案 0 :(得分:2)

我不确定为什么这是签名,但您应该能够augment the module/interface添加通用签名。
类似的东西:

declare module "immutable" {
    module Collection {
       interface Collection<K, V> {
           concat(...valuesOrCollections: Array<V>): Collection<K, V>;
       }
    }
}

答案 1 :(得分:0)

好的,所以我试图在不可变的源代码中修改类型定义并运行测试,现在我看到为什么他们有自己的类型定义。

他们希望基本上支持所有内容,就像(显然)最初的JS api一样。例如,添加对象属性:

  it('concats objects to keyed seq', () => {
    let a = Seq({a: 1, b: 2, c: 3});
    let b = {d: 4, e: 5, f: 6};
    expect(a.concat(b).toObject()).toEqual({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6});
  });

直接添加多个值作为参数:

  it('concats values', () => {
    let a = Seq.of(1, 2, 3);
    expect(a.concat(4, 5, 6).size).toBe(6);
    expect(a.concat(4, 5, 6).toArray()).toEqual([1, 2, 3, 4, 5, 6]);
  });

甚至在参数中添加多个数组:

  it('concats multiple arguments', () => {
    let a = Seq.of(1, 2, 3);
    let b = [4, 5, 6];
    let c = [7, 8, 9];
    expect(a.concat(b, c).size).toBe(9);
    expect(a.concat(b, c).toArray()).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  });

要在打字稿中以类型安全的方式获取此内容,我们需要多次重载(concatCollectionconcatValuesconcatProperties等等。)

PS:公平地说,原始定义中的参数名称是一个很好的提示:valuesOrCollections

更新:在我开了一个小PR之后,维护者实现了an exhaustive fully type-safe solution