繁体   English   中英

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

[英]immutables typescript type definitions: why is concat operating on any?

我不明白为什么Collection<K, V> concat的定义使用any

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

为什么不能这样:

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

我不确定为什么这是签名,但你应该能够扩充模块/接口以添加通用签名。
就像是:

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

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

他们希望基本上支持所有内容,就像(显然)最初的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]);
  });

为了在concatCollection中以类型安全的方式获得这个,我猜需要多个重载( concatCollectionconcatValuesconcatProperties等)。

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

更新:在我打开一个小PR之后,维护者实现了一个详尽的完全类型安全的解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM