[英]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
中以类型安全的方式获得这个,我猜需要多个重载( concatCollection
, concatValues
, concatProperties
等)。
PS:公平地说,原始定义中的参数名称是一个很好的提示: valuesOrCollections
更新:在我打开一个小PR之后,维护者实现了一个详尽的完全类型安全的解决方案 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.