我不明白为什么Collection<K, V>
中的the definition of concat
使用了any
:
concat(...valuesOrCollections: Array<any>): Collection<any, any>;
为什么不能:
concat(...valuesOrCollections: Array<V>): Collection<K, V>;
答案 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]);
});
要在打字稿中以类型安全的方式获取此内容,我们需要多次重载(concatCollection
,concatValues
,concatProperties
等等。)
PS:公平地说,原始定义中的参数名称是一个很好的提示:valuesOrCollections
更新:在我开了一个小PR之后,维护者实现了an exhaustive fully type-safe solution。